Советник на основе свечных комбинаций, трудности написания - страница 4

 
Konsens:

Добрый день, если советник проверяет условия стратегии и открывает ордер на первом тике (начале) бара:


static int bar;
if(Time[0]==bar) return;
bar=Time[0];


то

1) Всегда ли будет успевать открывать (проверять условия) ордер, или первый тик недостаточен ?

Где Вы увидели в коде тик?
 
Reshetov:
Где Вы увидели в коде тик?
Первая минута - будет правильнее? Time[0] - либо первая секунда, либо первая минута. Суть вопроса от этого не меняется (пока) - успеет ли сова проверить условия и открыть ордер, или нужно продливать, если нужно, то как посоветуйте?
 
Konsens:
Первая минута - будет правильнее? Time[0] - либо первая секунда, либо первая минута. Суть вопроса от этого не меняется (пока) - успеет ли сова проверить условия и открыть ордер, или нужно продливать, если нужно, то как посоветуйте?
Сказки не выдумывайте, а внимательно читайте документацию. См. Time[]
 
Reshetov:
Сказки не выдумывайте, а внимательно читайте документацию. См. Time[]
Ну и что вы мне суете? Не выдумываю - фантазирую! Вопрос неуместным показался?
 
Konsens:
Ну и что вы мне суете? Не выдумываю - фантазирую! Вопрос неуместным показался?
Поспокойнее, пожалуйста, и поуважительней. То, что вы не поняли смысла ответа, не означает, что ответ некомпетентный, скорее, наоборот.

При появлении сигнала на вход управление должно передаваться блоку открытия, который будет открывать позицию по своему алгоритму. Качественно исполненный блок открытия предусматривает адекватную реакцию на реквоты, заданное число повторных попыток, прекращение попыток открытия в безнадежных ситуациях и подробные сообщения в журнал и лог.


Вот пример простого блока известного программиста для buy.

int fOrderOpenBuy(){
#property copyright "Integer"

   RefreshRates();
   double lts=fGetLotsSimple1(OP_BUY);
      if(lts>0){      
         if(!IsTradeContextBusy()){
            double slts=ND(Ask-Point*StopLoss);
            if(StopLoss==0)slts=0;
            double tpts=ND(Ask+Point*TakeProfit);
            if(TakeProfit==0)tpts=0;
            int irv=OrderSend(Symbol(),OP_BUY,lts,ND(Ask),Slippage,slts,tpts,CommentOrder,Magic_N,0,Aqua);
               if(irv>0){
                  LastBuyTime=iTime(NULL,TimeFrame,0);
                  LastSellTime=0;
                  return(irv);
               }
               else{
                  Print ("Error open BUY. "+fMyErDesc(GetLastError())); 
                  return(-1);
               }
         }
         else{
            static int lt2=0;
               if(lt2!=iTime(NULL,TimeFrame,0)){
                  lt2=iTime(NULL,TimeFrame,0);
                  Print("Need open buy. Trade Context Busy");
               }            
            return(-2);
         }
      }
      else{
         static int lt3=0;
            if(lt3!=iTime(NULL,TimeFrame,0)){
               lt3=iTime(NULL,TimeFrame,0);
               if(lts==-1)Print("Need open buy. No money");
               if(lts==-2)Print("Need open buy. Wrong lots size");                  
            }
         return(-3);                  
      }
}  
 

Всем привет. На данном этапе возникло парочку проблем, подскажите кому не трудно. Данный советник работает по свечному анализу, только на покупку.

Вопросы.

1) Как прописать правильно условие, чтоб разница High(1)-Low(1) (это сигнальный бар у меня) не превышала в ЧЕТЫРЕ раза разницу High(i)-Low(i) (это молот у меня). Приблизительно я думал чтоб оно было написано так- if(High[1]-Low[1]<High[i]-Low[i]*4)

В коде выделено зелёным цветом.

2) Почему открывается 2я и 4я сделка если они не соотвецтвуют моим условиям??? Условия выделил красным цветом. 

//+------------------------------------------------------------------+
//|                                                  DojiTrader.mq4  |



#property link      "http://www.forex-instruments.info/"

//---- input parameters
extern int       Lots=1;
extern int       Target=15; //тейк профит

int    MagicNumber = 89354658;
string MagicName = "DojiTrader";
int      eDirection = 0; 
int      vsp=0, SigM = 0;
//+------------------------------------------------------------------+
int OpenTime=1;

int start()
  {
//----            
   int orders = 0;
   int i = 0;        
   

   for(i = 0; i < OrdersTotal(); i++ )  
      {
      OrderSelect(i,SELECT_BY_POS);     
      if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      {
         orders ++; 
         break;
      }
   }
  //////////////////////////////////////////////////////////////////////////////////////////////
   //регулирует количество открытых ордеров на 1 сиграл
   for(i = 1; i < OrdersTotal(); i++ )  //количество открытых ордеров на 1 больше
      {
      OrderSelect(i,SELECT_BY_POS);     //выбираем текущий ордер
      if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      {
         orders ++; //если нет не 1го открытого ордера то разрешается открытие ордера +1
         break;
      }
   }   
 ///////////////////////////////////////////////////////////////////////////////////////////////  
   if(orders < 1 )
      {
         for(i = 1; i < Bars; i++ ) //нанный цикл связывает i с текущим баром
      {
           //Молот
            if((((Open[i]-Close[i])*1.5<(Close[i]-Low[i]))&&((High[i]-Low[i])>Point*1)&&((Open[i]-Close[i])>=(High[i]-Open[i])*2)) 
              ||((Close[i]-Open[i])*1.5<(Open[i]-Low[i])&&((High[i]-Low[i])>Point*1)&&((Close[i]-Open[i])>=(High[i]-Close[i])*2))  
                ||(((Open[i]-Low[i])>(High[i]-Open[i])*3)&&((High[i]-Low[i])>Point*1)&&(Open[i]==Close[i])))                      

         {
            eDirection = 1;
            break;
         }    
             if(((Open[i]-Close[i])*4.5<(Close[i]-Low[i])&&(Open[i]>Close[i])&&(Open[i]-Close[i])>=(High[i]-Open[i]))                     
               ||((Close[i]-Open[i])*4.5<(Open[i]-Low[i])&&(Close[i]>Open[i])&&(Close[i]-Open[i])>=(High[i]-Close[i])))                   
         {
            eDirection = 2;
            break;
         }   
      }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
     //если мы имели молот в течении трёх последних баров 
 int TPv=(High[1]-Low[i])*10000; 
      if(i < 3 && i > 0)//бар на которых разрешается торговать
      {      
         if(SigM == 0)
          {       
           if(High[i] < Close[1]) //сигнальный бар
           {
             if(Low[i]<Low[i+1])    //минимум молота ниже предыдущего минимума
             {
               if(Bid>High[1])        //цена больше сигнального бара
               {
                 if((High[i+1]<High[i+2])&&(Low[i+1]<Low[i+2]))   //определяю тренд                  
//                  if(High[1]-Low[1]<High[i]-Low[i]*4) //защита от всплеска
//                    {
                      SigM = 1; //сигнал на покупку
 //                   }
                }
              }
            }
          }
       }
      else
      {
         SigM = 0;
      }
      
 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      //Молот покупаем
      if (eDirection==1 && SigM ==1 && iBarShift(NULL,0,OpenTime) != 0)
      {
         OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Low[i]-3*Point,Ask+TPv*Point,MagicName,MagicNumber,0,Green);
         OpenTime = iTime(NULL,0,0);
      }
      //Молот покупаем
      if(eDirection == 1 && SigM==1 && iBarShift(NULL,0,OpenTime) != 0)
      {
        OrderSend(Symbol(),OP_BUY,Lots,Ask,5,High[i]+3*Point,Bid-TPv*Point,MagicName,MagicNumber,0,Red);
        OpenTime = iTime(NULL,0,0);
      }      
   }    
 
  
//----
   return(0);
  }




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


 
if(High[1]-Low[1]<High[i]-Low[i]*4) заменить на if(High[1]-Low[1]<(High[i]-Low[i])*4)
 
Arles:
if(High[1]-Low[1]<High[i]-Low[i]*4) заменить на if(High[1]-Low[1]<(High[i]-Low[i])*4)

Спасибо! Осталось со 2м вопросом разобратся
 
Ну подскажите кто ко со 2м вопросом
Причина обращения: