МТ4 много сделок - страница 4

 
Igor Kryuchkov:
В тестере роботы для БО не тестируются. Ордера не те.

Сейчас посмотрю, чего там еще! Нашел свою ошибку

 if((j==1&&data<=(70*Point()))||(j==2&&data>=(30*Point())))

надо переделать, похоже лишнего добавил в условие, надо удалить.

(  *Point())


Можно добавить еще  вот такую строчку, чтобы наблюдать работу сигнала

Comment(data);
 
Alexey Busygin:

Сейчас посмотрю, чего там еще! Нашел свою ошибку

надо переделать, похоже лишнего добавил в условие, надо удалить.

Подправил. Все равно не выставляет ордера. Можно его экспертом сделать, а не скриптом?
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
  int j=0;double ts=0.0;
  int Counted_bars=IndicatorCounted(); 
  int i=Bars-Counted_bars-1; 

  while(i>=0) 
       { 
       double data=iRSI(NULL,0,3,PRICE_CLOSE,0);
       
       if((j==1&&data<70)||(j==2&&data>30)){j=0;if(OrdersTotal()>1){continue;}}    
       if(data>=70&&j!=1)
         {
         if(OrdersTotal()<1)
           {
           j=1; 
           if(ts<0.0){Stavka=Stavka*2;}
           if(ts>0.0){Stavka=1.0;}
           int a=OrderSend(Symbol(),OP_SELL,Stavka,Bid,3,0,0,"BO exp:60");
           }
         } 
       if(data<30&&j!=2)
         {
         if(OrdersTotal()<1)
           {
           j=2; 
           if(ts<0.0) {Stavka=Stavka*2;}
           if(ts>0.0) {Stavka=1;}
           int b=OrderSend(Symbol(),OP_BUY,Stavka,Ask,3,0,0,"BO exp:60");
           }
         i--; 
         }
       }

  ts=isCloseLastPosByStopTrade(Symbol(),-1,-1);
  return;
  }
//+------------------------------------------------------------------+

double isCloseLastPosByStopTrade(string sy="0",int op=-1,int mn=0)
     {
     //datetime t;
     double   j=0.0;
     int      i,k=OrdersHistoryTotal();
 
     if(sy=="0"){sy=Symbol();}
     for(i=0;i<k;i++)
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
          {
          if(OrderSymbol()==sy)//сравниваем символ
            {
            if((OrderType()==OP_BUY&&op==OP_BUY)||(OrderType()==OP_SELL&&op==OP_SELL))//сравниваем тип ордера
              {
              if(OrderMagicNumber()==mn)//сравниваем магик
                {
                //t=OrderCloseTime();
                j=OrderProfit();return(j);// нашли j
                }
              }
            }
          else {j=0.0;}
          }
         }
     return(j);
     }
 
Igor Kryuchkov:
Подправил. Все равно не выставляет ордера. Можно его экспертом сделать, а не скриптом?

Ждите исполнения условий.

Отдельно функцию протестировал, все открывает. Сейчас жду когда условие совпадет, потом посмотрим откроет или нет.

На евро паре сигнал показывает 49, то есть условия не соответствуют открытию 70 и 30

 
И еще, авто торговлю не забывайте включать.
 
Alexey Busygin:
И еще, авто торговлю не забывайте включать.
Срабатывает только при запуске. Иногда не срабатывает, иногда когдра РСИ больше 70 он покупает, а должен продавать.
 

Вот результат


#property show_inputs
#property strict

extern double  Stavka=1.00;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
  int j=0;double ts=0.0;
  int Counted_bars=IndicatorCounted(); 
  int i=Bars-Counted_bars-1; 

  while(!IsStopped()) 
       { 
       double data=iRSI(NULL,0,14,PRICE_CLOSE,0);
       Comment(data);
       if((j==1&&data<=70)||(j==2&&data>=30)){j=0;if(OrdersTotal()>1){continue;}}    
       if(data>=70&&j!=1)
         {
         if(OrdersTotal()<1)
           {
           j=1; 
           if(ts<0.0){Stavka=Stavka*2;}
           if(ts>0.0){Stavka=1.0;}
           int a=OrderSend(Symbol(),OP_SELL,Stavka,Bid,3,0,0,"BO exp:60");Sleep(300);
           }
         } 
       if(data<=30&&j!=2)
         {
         if(OrdersTotal()<1)
           {
           j=2; 
           if(ts<0.0) {Stavka=Stavka*2;}
           if(ts>0.0) {Stavka=1;}
           int b=OrderSend(Symbol(),OP_BUY,Stavka,Ask,3,0,0,"BO exp:60");Sleep(300);
           }
         i--; 
         }
       Comment("");
      // Sleep(3000);
       }

  ts=isCloseLastPosByStopTrade(Symbol(),-1,-1);
  Comment("");
  return;
  }
//+------------------------------------------------------------------+

double isCloseLastPosByStopTrade(string sy="0",int op=-1,int mn=0)
     {
     //datetime t;
     double   j=0.0;
     int      i,k=OrdersHistoryTotal();
 
     if(sy=="0"){sy=Symbol();}
     for(i=0;i<k;i++)
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
          {
          if(OrderSymbol()==sy)//сравниваем символ
            {
            if((OrderType()==OP_BUY&&op==OP_BUY)||(OrderType()==OP_SELL&&op==OP_SELL))//сравниваем тип ордера
              {
              if(OrderMagicNumber()==mn)//сравниваем магик
                {
                //t=OrderCloseTime();
                j=OrderProfit();return(j);// нашли j
                }
              }
            }
          else {j=0.0;}
          }
         }
     return(j);
     }
Все работает, открывает по сигналу, одну штуку.
 
Igor Kryuchkov:
Срабатывает только при запуске. Иногда не срабатывает, иногда когдра РСИ больше 70 он покупает, а должен продавать.

Как в исходнике было 70 Sell так я и оставил.

Еще обратите внимание на изменение цикла

 while(!IsStopped()) 
 
Alexey Busygin:

Как в исходнике было 70 Sell так я и оставил.

Еще обратите внимание на изменение цикла

Запустил скрипт. Он сразу открыл сделку, потому что РСи был меньше 30. Все правильно. Потом рси был больше 30 и через свечу рси стал меньше 30, но скрипт молчит! 
 
Igor Kryuchkov:
Запустил скрипт. Он сразу открыл сделку, потому что РСи был меньше 30. Все правильно. Потом рси был больше 30 и через свечу рси стал меньше 30, но скрипт молчит! 

Это условие, которое у вас было прописано.

if((j==1&&data<=70)||(j==2&&data>=30)){j=0;if(OrdersTotal()>1){continue;}}

Если OrdersTotal() больше 1 то пропускаем. Иначе у вас, будет открывать как раньше, много и в одном месте.

На сегодня все, другие дела ждут, пока!