Ошибка в коде

 

Всем привет.


Написал советника и хочу прогнать по тестеру, но вижу только, что открывается одна сделка и дальше тестер просто "думает" ( никакого прогресса).


Подскажите, пожалуйста, может в коде что-то намудрил?


Спасибо.

extern double Lot = 0.1;
extern int Magic   = 11111111;
extern bool New_Bar=false;


int P1 = PERIOD_H4;
int P2 = PERIOD_H1;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+








void Fun_New_Bar()                              // Ф-ия обнаружения ..
  {                                             // .. нового бара
   static datetime New_Time=0;                  // Время текущего бара
   New_Bar=false;                               // Нового бара нет
   if(New_Time!=Time[0])                        // Сравниваем время
     {
      New_Time=Time[0];                         // Теперь время такое
      New_Bar=true;                             // Поймался новый бар
     }
  }
  
  
int Direction()
{

double MA_B1, MA_B2, MA_B3, MA_L1, MA_L2, MA_L3;
double MACD_B1, MACD_B2, MACD_B3, MACD_L1, MACD_L2, MACD_L3;
double SMACD_B1, SMACD_B2, SMACD_B3, SMACD_L1, SMACD_L2, SMACD_L3;

MA_B1=iMA(NULL,P1,26,0,MODE_SMA,PRICE_CLOSE,1);
MA_B2=iMA(NULL,P1,26,0,MODE_SMA,PRICE_CLOSE,2);
MA_B3=iMA(NULL,P1,26,0,MODE_SMA,PRICE_CLOSE,3);
MA_L1=iMA(NULL,P2,26,0,MODE_SMA,PRICE_CLOSE,1);
MA_L2=iMA(NULL,P2,26,0,MODE_SMA,PRICE_CLOSE,2);
MA_L3=iMA(NULL,P2,26,0,MODE_SMA,PRICE_CLOSE,3);

MACD_B1=iMACD(NULL,P1,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
MACD_B2=iMACD(NULL,P1,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
MACD_B3=iMACD(NULL,P1,12,26,9,PRICE_CLOSE,MODE_MAIN,3);
MACD_L1=iMACD(NULL,P2,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
MACD_L2=iMACD(NULL,P2,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
MACD_L3=iMACD(NULL,P2,12,26,9,PRICE_CLOSE,MODE_MAIN,3);


SMACD_B1=iMACD(NULL,P1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
SMACD_B2=iMACD(NULL,P1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2);
SMACD_B3=iMACD(NULL,P1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,3);
SMACD_L1=iMACD(NULL,P2,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
SMACD_L2=iMACD(NULL,P2,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2);
SMACD_L3=iMACD(NULL,P2,12,26,9,PRICE_CLOSE,MODE_SIGNAL,3);





if((MACD_B1>MACD_B2 && MA_B1>MA_B2) && (MACD_B2<MACD_B3 && MA_B2<MA_B3))
   {
   
      if((MACD_L1>MACD_L2 && MA_L1>MA_L2) /*&& (MACD_L2<MACD_L3 && MA_L2<MA_L3)*/)
         
         return(1);
         
      
   
   }


if((MACD_B1<MACD_B2 && MA_B1<MA_B2) && (MACD_B2>MACD_B3 && MA_B2>MA_B3))
   {
   if((MACD_L1<MACD_L2 && MA_L1<MA_L2) /*&& (MACD_L2>MACD_L3 && MA_L2>MA_L3)*/)
   
   return(-1);
   }

return(0);
}  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----

Fun_New_Bar();
Direction();


if(New_Bar==true)
   {
   if(OrdersTotal()<1)
   {
   if(Period()==P2)
      {
      if(Direction()==1)
         OrderSend(Symbol(),OP_BUY,Lot,Ask,2,Low[1],0,"buy",Magic,0,Green);
         
      if(Direction()==-1)
         OrderSend(Symbol(),OP_SELL,Lot,Bid,2,High[1],0,"sell",Magic,0,Red);   
      }
      
   }


if(OrdersTotal()>0)
   {
     for(int i=OrdersTotal()-1; i<OrdersTotal(); i--)
      {
         if(OrderSelect(i,SELECT_BY_POS))
            {
            if(OrderType()==OP_BUY && OrderMagicNumber()==Magic)
               {
               if(Direction()!=1)
               OrderClose(OrderTicket(),OrderLots(),Bid,2,Blue); 
               }
               
            if(OrderType()==OP_SELL && OrderMagicNumber()==Magic)
               {
               if(Direction()!=-1)
               OrderClose(OrderTicket(),OrderLots(),Ask,2,Blue); 
               }   
            }
      }
   
   }

}
   //GetLastError();
   //Print("error=", GetLastError());
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Maks:

Всем привет.


Написал советника и хочу прогнать по тестеру, но вижу только, что открывается одна сделка и дальше тестер просто "думает" ( никакого прогресса).


Подскажите, пожалуйста, может в коде что-то намудрил?


Спасибо.

Блин, пока писал ответ успел ветку переименовать, молодец.

Вкратце;

Закрой блок открытия, поставь круглую скобку }

А после блока закрытия удали.

Еще условия закрытия, если Direction()==0, а он будет равен 0, подумай что будет?

правильно, открыл и сразу закрыл.

 
r772ra:

Блин, пока писал ответ успел ветку переименовать, молодец.

Вкратце;

Закрой блок открытия, поставь круглую скобку }

А после блока закрытия удали.

Еще условия закрытия, если Direction()==0, а он будет равен 0, подумай что будет?

правильно, открыл и сразу закрыл.



Сори за ситуацию - просто нашел лаг в коде и, так, как пока ответов небыло, решил удалить ту тему и завести новую с правильным кодом.

Изменения внес, но без результата.

А при Direction()==0 у меня ордера не открываются (мне не нужно открывать при таком значении и в коде это прописано)

 
Maks:

Всем привет.


Написал советника и хочу прогнать по тестеру, но вижу только, что открывается одна сделка и дальше тестер просто "думает" ( никакого прогресса).


Подскажите, пожалуйста, может в коде что-то намудрил?


Спасибо.

if(OrdersTotal()>0) // В принципе, при правильно написанном коде - это лишнее условие.
   {
     for(int i=OrdersTotal()-1; i<OrdersTotal(); i--) // Как Вы предполагаете - когда этот цикл закончится ?
      {
         if(OrderSelect(i,SELECT_BY_POS))
            {
            if(OrderType()==OP_BUY && OrderMagicNumber()==Magic)
               {
               if(Direction()!=1)
               OrderClose(OrderTicket(),OrderLots(),Bid,2,Blue); 
               }
               
            if(OrderType()==OP_SELL && OrderMagicNumber()==Magic)
               {
               if(Direction()!=-1)
               OrderClose(OrderTicket(),OrderLots(),Ask,2,Blue); 
               }   
            }
      }
   
   }
 
Maks:



Сори за ситуацию - просто нашел лаг в коде и, так, как пока ответов небыло, решил удалить ту тему и завести новую с правильным кодом.

Изменения внес, но без результата.

А при Direction()==0 у меня ордера не открываются (мне не нужно открывать при таком значении и в коде это прописано)

Нет, при закрытии

У вас

            if(OrderType()==OP_BUY && OrderMagicNumber()==Magic)
               {
               if(Direction()!=1) //вот функция возвращает 0, будет исполнятся
               OrderClose(OrderTicket(),OrderLots(),Bid,2,Blue); 
               }
               
            if(OrderType()==OP_SELL && OrderMagicNumber()==Magic)
               {
               if(Direction()!=-1)//и тут
               OrderClose(OrderTicket(),OrderLots(),Ask,2,Blue); 
 
VladislavVG:



Спасибо, теперь все работает
Причина обращения: