Problem z zamykaniem pozycji [EA]

O jezykach programowania w platformach i nie tylko.
psk89
Stały bywalec
Stały bywalec
Posty: 48
Rejestracja: 21 cze 2016, 07:39

Problem z zamykaniem pozycji [EA]

Nieprzeczytany post autor: psk89 »

Witam,

Mam problem polegający na tym, że napisany EA nie zamyka pozycji zgodnie z założeniem MACD0 < MACDsignal0 dla otwartej pozycji kupna oraz MACD0 < MACDsignal0 dla pozycji sprzedaży.

EA otwiera pozycję poprawnie, zgodnie z założeniami.
Poniżej przedstawiam część kodu dającą sygnał "direcao = 3 lub 4 który odpowiednio ma dawać sygnał do zamknięcia pozycji.

Kod: Zaznacz cały

int exit()
{
int Direcao = 0;
double MACD0 =0 , MACDsignal0 =0;
double adx0=0,adx1=0,adx2=0, pDI=0, mDI=0; 

   MACD0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,1);
   MACDsignal0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_SIGNAL,1);
   adx0 = iADX(NULL, 0, 14, PRICE_CLOSE,MODE_MAIN, 0);
   adx1 = iADX(NULL, 0, 14, PRICE_CLOSE,MODE_MAIN, 1);
   adx2 = iADX(NULL, 0, 14, PRICE_CLOSE,MODE_MAIN, 2);
   pDI  = iADX(Symbol(),0,ADX,PRICE_LOW,MODE_PLUSDI,0);
   mDI  = iADX(Symbol(),0,ADX,PRICE_LOW,MODE_MINUSDI,0);
   


if(MACD0 < MACDsignal0 )
{
Direcao = 3; //buy
}

if(MACD0 < MACDsignal0  )
{
Direcao = 4; 
}


return (Direcao);

}
Niżej znajduję się całkowity kod EA:

Kod: Zaznacz cały


extern double    Lots=0.1;
extern int ADX = 14;
extern int NumeroMagico = 100;
extern int Period_MA1 = 5;
extern int Period_MA2 = 144;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   double  p=Point;
   int     OrdersPerSymbol=0;
   int     cnt=0;
   double tp = Ask + 50*Point;
   double sl = Bid - 50*Point;
   
   if(Bars<150)                               {Print("-----NO BARS "); return(0);}
   OrdersPerSymbol=0;
   
   
     for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if( OrderSymbol()==Symbol() )
        {
         OrdersPerSymbol++;
        }
     }
     
      
     
     for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if( OrderSymbol()==Symbol() )
        {
         if(OrderType()==OP_BUY)
           {
            
            if( exit() == 3)
              {
               OrderClose(OrderTicket(),Lots,Bid,0,White);
               
              }
           } // if BUY


         if(OrderType()==OP_SELL)
           {
            // did we make our desired SELL profit?
            if ( exit() == 4 )
              {
               OrderClose(OrderTicket(),Lots,Ask,0,Red);
               //Fechado = 1;
              }
           } //if SELL
           
        } // if(OrderSymbol)
        
     } // for
   //Abre as ordens apenas se năo possuir nenhuma ordem aberta por Simbolo
   if(OrdersPerSymbol<1)
     {
      if(Sinal() == 1)
		  {
         OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,"Buy  "+CurTime(),NumeroMagico,0,White);
         return(0);
        }
        
      if(Sinal() == 2)
        {
         OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,"Sell "+CurTime(),NumeroMagico,0,Red);
         return(0);
        }
     }



 
//----
   return(0);
  }
  
  //+------------------------------------------------------------------+
//| Gerador de sinais                                          |
//+------------------------------------------------------------------+  
int Sinal()
{
 //set ADX Trend
    int Direcao = 0; // 1 indica compra , 2 indica venda
   double MA_1, MA_2;
   double MACD0, MACD1, MACD2, MACDsignal0;
   double rsi0, rsi1; 
   double adx0, adx1, pDI,mDI;

     
   MA_1 = iMA(NULL,0,Period_MA1,0,MODE_EMA,PRICE_CLOSE,0); 
   MA_2 = iMA(NULL,0,Period_MA2,0,MODE_EMA,PRICE_CLOSE,0);
   
   MACD0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,0);
   MACD1 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,1);
   MACD2 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,2);
   MACDsignal0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_SIGNAL,0);
   
   rsi0 = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);
   rsi1 = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
   
   adx0 = iADX(Symbol(),0,ADX,PRICE_LOW,MODE_MAIN,0);
   adx1 = iADX(Symbol(),0,ADX,PRICE_LOW,MODE_MAIN,1);
   pDI  = iADX(Symbol(),0,ADX,PRICE_LOW,MODE_PLUSDI,0);
   mDI  = iADX(Symbol(),0,ADX,PRICE_LOW,MODE_MINUSDI,0);
   
   

   
   

 
   
   if ( MA_1>MA_2 && MA_1-MA_2>=100*Point && MACD0>MACD1>MACD2 && MACD0>0 && MACD0>MACDsignal0 && rsi0>70 && rsi0>=rsi1 && adx0>adx1 && pDI>mDI && pDI>adx0 )
   {
      Direcao = 1; //buy
   }
   else if ( MA_1<MA_2 && MA_2-MA_1>=100*Point && MACD0<MACD1<MACD2 && MACD0<0 && MACD0<MACDsignal0 && rsi0<30 && rsi0<=rsi1 && adx0>adx1 && pDI<mDI && mDI>adx0 ) 
   {
      Direcao = 2; //sell
   }
   //end ADX
   


   return (Direcao);

}

//+------------------------------------------------------------------+

int exit()
{
int Direcao = 0;
double MACD0 =0 , MACDsignal0 =0;
double adx0=0,adx1=0,adx2=0, pDI=0, mDI=0; 

   MACD0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,1);
   MACDsignal0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_SIGNAL,1);
   adx0 = iADX(NULL, 0, 14, PRICE_CLOSE,MODE_MAIN, 0);
   adx1 = iADX(NULL, 0, 14, PRICE_CLOSE,MODE_MAIN, 1);
   adx2 = iADX(NULL, 0, 14, PRICE_CLOSE,MODE_MAIN, 2);
   pDI  = iADX(Symbol(),0,ADX,PRICE_LOW,MODE_PLUSDI,0);
   mDI  = iADX(Symbol(),0,ADX,PRICE_LOW,MODE_MINUSDI,0);
   


if(MACD0 < MACDsignal0 )
{
Direcao = 3; //buy
}

if(MACD0 < MACDsignal0  )
{
Direcao = 4; 
}


return (Direcao);

}
Bardzo proszę o jakąkolwiek pomoc.

psk89
Stały bywalec
Stały bywalec
Posty: 48
Rejestracja: 21 cze 2016, 07:39

Re: Problem z zamykaniem pozycji [EA]

Nieprzeczytany post autor: psk89 »

Zmodyfikowałem EA do poniżej postaci:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                               Moving Average.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Average sample expert advisor"

#define MAGICMA  20131111
//--- Inputs
double Lots          =0.1;

//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//---
   

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double MA_1, MA_2;
   double MACD0, MACD1, MACD2, MACDsignal0;
   double rsi0, rsi1; 
   double adx0, adx1, pDI,mDI;
   int    res;
//--- go trading only for first tiks of new bar
  // if(Volume[0]>1) return;
//--- get Moving Average 
   MA_1 = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0); 
   MA_2 = iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,0);
   
   MACD0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,0);
   MACD1 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,1);
   MACD2 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,2);
   MACDsignal0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_SIGNAL,0);
   
   rsi0 = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);
   rsi1 = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
   
   adx0 = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_MAIN,0);
   adx1 = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_MAIN,1);
   pDI  = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_PLUSDI,0);
   mDI  = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_MINUSDI,0);
//--- sell conditions
   if(MA_1<MA_2 && MA_2-MA_1>=100*Point && MACD0<MACD1<MACD2 && MACD0<0 && MACD0<MACDsignal0 && rsi0<30 && rsi0<=rsi1 && adx0>adx1 && pDI<mDI && mDI>adx0)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//--- buy conditions
   if(MA_1>MA_2 && MA_1-MA_2>=100*Point && MACD0>MACD1>MACD2 && MACD0>0 && MACD0>MACDsignal0 && rsi0>70 && rsi0>=rsi1 && adx0>adx1 && pDI>mDI && pDI>adx0)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double MA_1, MA_2;
   double adx0,adx1,adx2, pDI, mDI;
//--- go trading only for first tiks of new bar
  // if(Volume[0]>1) return;
//--- get Moving Average 
   adx0 = iADX(NULL, 0, 14, PRICE_CLOSE,MODE_MAIN, 0);
   pDI  = iADX(NULL,0,14,PRICE_CLOSE,MODE_PLUSDI,0);
   mDI  = iADX(NULL,0,14,PRICE_CLOSE,MODE_MINUSDI,0);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if( pDI < adx0)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if( mDI < adx0 )
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<150 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//---
  }
//+------------------------------------------------------------------+
Niektóre pozycję są otwierane i zamykane zgodnie z założeniami ale niestety zdarza się iż EA otwiera również pozycję gdy przy nie spełnionych założeniach przy użyciu konstrukcji if.
Załączam screen shot'a gdzie pokazana jest nieprawidłowo otwarta pozycja. Warunek RSI oraz MACD nie są spełnione, a mimo tego EA otworzył pozycję.
Jak widać podczas symulacji pojawiają się erroru typu:
2016.08.20 10:09:53.074 TestGenerator: unmatched data error (volume limit 162 at 2016.08.11 14:30 exceeded)
i warrinigi przy otwieraniu pozycji.
Czy mógłby mi ktoś w stanie powiedzieć gdzie tutaj jest błąd w tym wszystkim i jak to rozwiązać?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: Problem z zamykaniem pozycji [EA]

Nieprzeczytany post autor: JAREK67 »

W całym kodzie zmień indeksy świec o 1.
Tak jak na obrazku.
EA pobierając dane ze świecy "0" ma co chwila inne warunki. Dopiero po zamknięciu tej świecy (kiedy będzie ona miała nr 1) EA będzie miało ustalone parametry, które bierze pod uwagę w dalszym algorytmie.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

psk89
Stały bywalec
Stały bywalec
Posty: 48
Rejestracja: 21 cze 2016, 07:39

Re: Problem z zamykaniem pozycji [EA]

Nieprzeczytany post autor: psk89 »

Jarek67, dziękuję za wskazówkę. Indeksy poprawione.
Widzę, że już nieco lepiej to wygląda lecz kolejnych kwiatków nie brakuje.
Załączam screen'a z przykładowego otwarcia sell'a który nie jest zgodny z założeniami:
MA_1<MA_2 && MA_2-MA_1>=100*Point && rsi0<30 && mDI>adx0
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: Problem z zamykaniem pozycji [EA]

Nieprzeczytany post autor: JAREK67 »

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                               Moving Average.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Average sample expert advisor"

#define MAGICMA  20131111
//--- Inputs
double Lots          =0.1;

//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//---
   

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double MA_1, MA_2;
   double MACD0, MACD1, MACD2, MACDsignal0;
   double rsi0, rsi1; 
   double adx0, adx1, pDI,mDI;
   int    res;
//--- go trading only for first tiks of new bar
  // if(Volume[0]>1) return;
//--- get Moving Average 
   MA_1 = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1); 
   MA_2 = iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);
   
   MACD0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,1);
   MACD1 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,2);
   MACD2 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,3);
   MACDsignal0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_SIGNAL,0);
   
   rsi0 = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
   rsi1 = iRSI(NULL, 0, 14, PRICE_CLOSE, 2);
   
   adx0 = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_MAIN,1);
   adx1 = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_MAIN,2);
   pDI  = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_PLUSDI,1);
   mDI  = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_MINUSDI,1);
//--- sell conditions
   if(MA_1<MA_2 && MA_2-MA_1>=100*Point && MACD0<MACD1<MACD2 && MACD0<0 && MACD0<MACDsignal0 && rsi0<30 && rsi0<=rsi1 && adx0>adx1 && pDI<mDI && mDI>adx0)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//--- buy conditions
   if(MA_1>MA_2 && MA_1-MA_2>=100*Point && MACD0>MACD1>MACD2 && MACD0>0 && MACD0>MACDsignal0 && rsi0>70 && rsi0>=rsi1 && adx0>adx1 && pDI>mDI && pDI>adx0)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
  
   double adx0, pDI, mDI;
//--- go trading only for first tiks of new bar
  // if(Volume[0]>1) return;
//--- get Moving Average 
   adx0 = iADX(NULL, 0, 14, PRICE_CLOSE,MODE_MAIN, 1);
   pDI  = iADX(NULL,0,14,PRICE_CLOSE,MODE_PLUSDI,1);
   mDI  = iADX(NULL,0,14,PRICE_CLOSE,MODE_MINUSDI,1);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if( pDI < adx0)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if( mDI < adx0 )
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<150 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//---
  }
//+------------------------------------------------------------------+
U mnie tej S nie otwiera.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

psk89
Stały bywalec
Stały bywalec
Posty: 48
Rejestracja: 21 cze 2016, 07:39

Re: Problem z zamykaniem pozycji [EA]

Nieprzeczytany post autor: psk89 »

dziwna sprawa. Rzeczywiście nie otwiera u Ciebie żadnej pozycji S, a warunki ku temu są. Dziwne :shock:
Jutro posiedzę jeszcze nad tym i może uda się coś zdziaiłać.

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: Problem z zamykaniem pozycji [EA]

Nieprzeczytany post autor: JAREK67 »

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                               Moving Average.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Average sample expert advisor"

#define MAGICMA  20131111
//--- Inputs
double Lots          =0.1;

//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//---
   

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double MA_1, MA_2;
   double MACD0, MACD1, MACD2, MACDsignal0;
   double rsi0, rsi1; 
   double adx0, adx1, pDI,mDI;
   int    res;
//--- go trading only for first tiks of new bar
  // if(Volume[0]>1) return;
//--- get Moving Average 
   MA_1 = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1); 
   MA_2 = iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);
   
   MACD0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,1);
   MACD1 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,2);
   MACD2 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_MAIN,3);
   MACDsignal0 = iMACD(NULL, 0, 12, 26, 9,PRICE_CLOSE, MODE_SIGNAL,0);
   
   rsi0 = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
   rsi1 = iRSI(NULL, 0, 14, PRICE_CLOSE, 2);
   
   adx0 = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_MAIN,1);
   adx1 = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_MAIN,2);
   pDI  = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_PLUSDI,1);
   mDI  = iADX(Symbol(),0,14,PRICE_CLOSE,MODE_MINUSDI,1);
//--- sell conditions
   if(MA_1<MA_2 && MA_2-MA_1>=100*Point && MACD0<MACD1 && MACD1<MACD2 && MACD0<0 && MACD0<MACDsignal0 && rsi0<30 && rsi0<=rsi1 && adx0>adx1 && pDI<mDI && mDI>adx0)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//--- buy conditions
   if(MA_1>MA_2 && MA_1-MA_2>=100*Point && MACD0>MACD1 && MACD1>MACD2 && MACD0>0 && MACD0>MACDsignal0 && rsi0>70 && rsi0>=rsi1 && adx0>adx1 && pDI>mDI && pDI>adx0)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
  
   double adx0, pDI, mDI;
//--- go trading only for first tiks of new bar
  // if(Volume[0]>1) return;
//--- get Moving Average 
   adx0 = iADX(NULL, 0, 14, PRICE_CLOSE,MODE_MAIN, 1);
   pDI  = iADX(NULL,0,14,PRICE_CLOSE,MODE_PLUSDI,1);
   mDI  = iADX(NULL,0,14,PRICE_CLOSE,MODE_MINUSDI,1);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if( pDI < adx0)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if( mDI < adx0 )
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<150 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//---
  }
//+------------------------------------------------------------------+
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

ODPOWIEDZ