Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Yury Reshetov
13471
Yury Reshetov  
Konsens:

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


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


то

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

Где Вы увидели в коде тик?
Konso
63
Konso  
Reshetov:
Где Вы увидели в коде тик?
Первая минута - будет правильнее? Time[0] - либо первая секунда, либо первая минута. Суть вопроса от этого не меняется (пока) - успеет ли сова проверить условия и открыть ордер, или нужно продливать, если нужно, то как посоветуйте?
Yury Reshetov
13471
Yury Reshetov  
Konsens:
Первая минута - будет правильнее? Time[0] - либо первая секунда, либо первая минута. Суть вопроса от этого не меняется (пока) - успеет ли сова проверить условия и открыть ордер, или нужно продливать, если нужно, то как посоветуйте?
Сказки не выдумывайте, а внимательно читайте документацию. См. Time[]
Konso
63
Konso  
Reshetov:
Сказки не выдумывайте, а внимательно читайте документацию. См. Time[]
Ну и что вы мне суете? Не выдумываю - фантазирую! Вопрос неуместным показался?
Виктор
Модератор
6559
Виктор  
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);                  
      }
}  
Fabtar123
98
Fabtar123  

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

Вопросы.

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);
  }




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


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

Спасибо! Осталось со 2м вопросом разобратся
Fabtar123
98
Fabtar123  
Ну подскажите кто ко со 2м вопросом
1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий