ONLY CANDLE / BAR - Как каталогизировать или разделить свечи? - ПОЖАЛУЙСТА, ПОПРАВЬТЕ МЕНЯ! - страница 4

 

У меня такое чувство, что мы немного потеряли контроль над кодом.

        if ( SignalBULL62Executed) CheckForClose_BULL6();       // I don't know it is the right place to close

Нет, это точно не то место.

   int    result;
   if(Bid==Close[1]+3*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA2,0,Red);
      return;
     }
   if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }   
  } 

Эта "обработка ошибок" не делает ничего лучше. Проверьте еще раз.

bool Fun_New_Bar()                              // bool             

   {                                
   static datetime New_Time=0;      
   New_Bar=false;                   
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      New_Bar=true;                    
      }
   }

Это создано не для развлечения! Его следует использовать для сброса выполненных флагов на новом баре.

if(Bid==Close[1]+3*Point)  

Что мы узнали о сравнении парных значений и имеет ли это смысл в данном случае?

 

Итак, вы решили удалить свой пост, на который я ссылаюсь... Молодец, это очень полезно!

 

Извините, но вчера были проблемы с интернетом (mql4.com перестал работать). Я пытался исправить кое-что и ........

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA1  2000        // blue starategy
#define MAGICMA2  2001        // red strategy

//+------------------------------------------------------------------+
//| Check NEW BAR                                |
//+------------------------------------------------------------------+
bool New_Bar = false;

bool Fun_New_Bar()                              // bool             

   {                                
   static datetime New_Time=0;      
   New_Bar=false;                   
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      New_Bar=true;                    
      }
   }

//+------------------------------------------------------------------+
//| Calculate open positions    HOW MEANY OF THIS is open   |
//+------------------------------------------------------------------+

//--- FOR BLUE---------------------------------------------------------
int OpenOrders_BULL4(string symbol)
  {
   int buys=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1)    // magic ma 1 ( is ==)
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
   return(buys);
  }
  
//--- FOR RED--------------------------------------------------------------
int OpenOrders_BULL6(string symbol)
  {
   int buys=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA2)    // magic ma 2 ( is ==)
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
   return(buys);
  }



//+------------------------------------------------------------------+
//| Condition candle                                                 |
//+------------------------------------------------------------------+
bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
   return(true);
   } 

bool BULL6()
   {
   if(Close[1]-Open[1]>=6*Point && Close[1]-Open[1]<=7*Point)
   return(true);
   }
      
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
//--------------------------- blue bull4 magicma1 
void OpenBULL41()
  {
   int    result;
   if(Bid==Close[1]+3*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);
      return(true);
     }
    if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }      
  }
  
void OpenBULL42()
  {
   int    result;
   
   for(int i=1;i<=OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1)    // magic ma 1 ( is ==)
        {
         if(Ask>OrderOpenPrice()+2*Point)  
            {
             result=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);
             return;
            }
          if (result == -1)
             {
             int e = GetLastError();
             Print(e);
             }    
        }
     }
  }  
//--------------------------- red bull6 magicma2 
void OpenBULL61()
  {
   int    result;
   if(Bid==Close[1]+3*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA2,0,Red);
      return;
     }
   if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }   
  }
  
void OpenBULL62()
  {
   int    result;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.62,Ask,0,Close[1]-25*Point,0,"",MAGICMA2,0,Red);
      return;
     }
    if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }     
  }

void OpenBULL63()
  {
   int    result;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.63,Ask,0,Close[1]-25*Point,0,"",MAGICMA2,0,Red);
      return;
     }
    if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }    
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

void CheckForClose_BULL4()
{

   if(OrderOpenPrice()+4*Point< Ask)
   for (int i = OrdersTotal()-1; i >= 0;i--)          // add: -1
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()&& OrderMagicNumber()==MAGICMA1) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Blue);

      }
   }
} 

void CheckForClose_BULL6()
{

   if(OrderOpenPrice()+8*Point< Ask)
   for (int i = OrdersTotal()-1; i >= 0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()&& OrderMagicNumber()==MAGICMA2) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);

      }
   }
}  
  
//+------------------------------------------------------------------+
//| flag                               |
//+------------------------------------------------------------------+ 
Fun_New_Bar();
if (New_Bar==false);
bool SignalBULL41Executed=false;
bool SignalBULL42Executed=false;
bool SignalBULL61Executed=false;
bool SignalBULL62Executed=false;
bool SignalBULL63Executed=false;

if(Fun_New_Bar())
{
   SignalBULL41Executed=true;
   return(SignalBULL41Executed);
}


  
  
//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
// ----------------bull4
if(BULL4())             
  if(!SignalBULL41Executed && OpenOrders_BULL4(Symbol())==0)
  {
    OpenBULL41();//do open buy position
    SignalBULL41Executed=true;
    if ( SignalBULL41Executed) CheckForClose_BULL4();       // I don't know it is the right place to close
  }
  
  
  if(!SignalBULL42Executed && OpenOrders_BULL4(Symbol())==1)
  {
    OpenBULL42();//do open buy position
    SignalBULL42Executed=true;
        if ( SignalBULL42Executed) CheckForClose_BULL4();       // I don't know it is the right place to close
  }
  
// ----------------bull6  
if(BULL6())             
  if(!SignalBULL61Executed && OpenOrders_BULL6(Symbol())==0)
  {
    OpenBULL61();//do open buy position
    SignalBULL61Executed=true;
        if ( SignalBULL61Executed) CheckForClose_BULL6();       // I don't know it is the right place to close
  }
  
  
  if(!SignalBULL62Executed && OpenOrders_BULL6(Symbol())==1)
  {
    OpenBULL62();//do open buy position
    SignalBULL62Executed=true;
        if ( SignalBULL62Executed) CheckForClose_BULL6();       // I don't know it is the right place to close
  }
  
  
  if(!SignalBULL63Executed && OpenOrders_BULL6(Symbol())==2)
  {
    OpenBULL63();//do open buy position
    SignalBULL42Executed=true;
        if ( SignalBULL62Executed) CheckForClose_BULL6();       // I don't know it is the right place to close
  }   

  }
//+------------------------------------------------------------------+
 

Нелегко вам помочь. Почему бы вам пока не попробовать реализовать только одну стратегию, но с соответствующейфункцией Open(), Close(), Count(), NewBar(), Signal().

Блок ниже находится за пределами функции start. Я не уверен, что это нужно.

Fun_New_Bar();
if (New_Bar==false);               // <-- ???
bool SignalBULL41Executed=false;   // <-- This could be correct, but I am not sure you know why and
bool SignalBULL42Executed=false;   //     its not more an accident that you initalize it here.
bool SignalBULL61Executed=false;
bool SignalBULL62Executed=false;
bool SignalBULL63Executed=false;

if(Fun_New_Bar())                  // <-- Your Fun_New_Bar() function doesn't return anything,
{                                  //     you set the global New_Bar variable with the function. 
   SignalBULL41Executed=true;      // <-- You should set it to false on a new bar.    
   return(SignalBULL41Executed);   // <-- ???
}
 

Я думаю так же, как и Вы, о маленьких шагах. Давайте возьмем только один вариант BULL4
Иногда выглядит как Ea для моей кодовой базы

https://www.mql5.com/en/code/9156 - интересно

Я понимаю их (но не чувствую), это флаг, ия понимаю его назначение.

Что вы думаете? О маленьких шагах

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA1  2000        // blue starategy


//+------------------------------------------------------------------+
//| Check NEW BAR                                |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Calculate open positions    HOW MEANY OF THIS is open   |
//+------------------------------------------------------------------+

int OpenOrders_BULL4(string symbol)
  {
   int buys=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1)   
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
   return(buys);
  }
  
//+------------------------------------------------------------------+
//| Condition candle                                                 |
//+------------------------------------------------------------------+
bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
      {
         return(true);
      } 
   else
      {
         return(false);
      } 
   }
//+------------------------------------------------------------------+
//| Condition send buy                                                 |
//+------------------------------------------------------------------+
 
bool BULL4send()
   {
   if( Bid==Close[1]+3*Point)
      {
         return(true);
      } 
    else
      {
        return(false);
      }
   }
 
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+

bool OpenBULL41()
  {
      int    result;

      result=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);
      if(result>0)
           {
            if(OrderSelect(result,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
      else
         {
            Print("Error opening BUY order : ",GetLastError()); 
            return(false);
         }
      return(true);       
   }
   
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

  
//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
// ----------------bull4
   if(BULL4() && BULL4send() && OpenOrders_BULL4(Symbol())==0)             

     {
       OpenBULL41();//do open buy position
     }
  }
//+------------------------------------------------------------------+
 

Да, маленькими шагами, так что с ошибками можно справиться...
Вы хотите выделить что-то конкретное из кодовой базы советника?

Я не увижу этого снова - я больше не буду помогать вам, если вы и дальше будете игнорировать шаги по исправлению, которые я - или кто-то другой - посоветовал сделать:

if( Bid==Close[1]+3*Point)

Проскальзывание равно 0? Вы, вероятно, получите ошибку. Но исправленная обработка ошибок поймает ее :-)

result=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);

Это не неправильно, но не идеально, и в худшем случае это не то, что вы хотите внутри цикла. Лучше всего, даже не начинайте использовать циклы от 0 до OrdersTotal. Читайте здесь: Циклы и закрытие или удаление заказов

for(int i=0;i<OrdersTotal();i++)

Каков спред вашего брокера и сколько цифр у вас есть для символа, которым вы хотите торговать? Я не уверен, что вы правильно используете Point (Читайте на первой странице вашей темы).

 
kronin:

Да, маленькими шагами, так что с ошибками можно справиться...
Вы хотите выделить что-то конкретное из кодовой базы EA?

Я думаю, что нет, нечего светить, я понимаю, что я написал.

Я не увижу этого снова - я не буду помогать вам больше, если вы будете и дальше игнорировать шаги коррекции, которые я - или кто-то другой - посоветовал сделать:

Да. Я знаю, что делать NormalizeDouble, я думаю, что я понимаю (если у меня есть: euro/usd = 1.2390022129.....09.... И нам нужно: 1,29893 конец! не бесконечность ), но я не могу написать это, может быть это?

if ( NormalizeDouble ( abc(),0 ) )

bool abc()

{

bool z,y,z;

x=Ставка;

y=Close[1]

z=x-y+3*Point

return(z);

}

или ?

If ( NormalizeDouble ((Close[1]-Bid) +3*point),0 ) ;

Проскальзывание равно 0? Вы, вероятно, получите ошибку. Но фиксированная обработка ошибок поймает ее :-)

Я могу иметь +1 без проблем result=OrderSend(Symbol(),OP_BUY,0.41,Ask, 1 ,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);

Ошибка будет обработана, хорошо, мы увидим, что будет после

Это не неправильно, но и не идеально, и в худшем случае это не то, что вы хотите внутри цикла. Лучше всего, даже не начинайте использовать циклы от 0 до OrdersTotal. Читайте здесь: Циклы и закрытие или удаление заказов

ОЧЕНЬ ХОРОШАЯ СТАТЬЯ! Я должен был прочитать ее в самом начале :)

Каков спред вашего брокера и сколько цифр у вас есть для символа, которым вы хотите торговать? Я не уверен, что вы правильно используете Point (прочитал на первой странице вашей темы).

Я помню их. У меня Admiral Market Bid = 1,29000 Ask = 1,29001. Это проблема, которую я знаю, но у меня нет решения на данный момент, я не нашел хорошего примера.

Я пишу код...

 
Wodzuuu:

Да. Я знаю, что делает NormalizeDouble, я думаю, что я понимаю (если у меня есть: euro/usd = 1.2390022129.....09.... И нам нужно: 1,29893 end! не бесконечность), но я не могу написать это, может быть это?


if (NormalizeDouble( abc(),0 ) )

bool abc()

{


Вы не можете NormalizeDouble() a bool, подсказка в названии функции и в документации тоже....

doubleNormalizeDouble(double value,intdigits)

 
RaptorUK:

Вы не можете NormalizeDouble() a bool, подсказка находится в названии функции и в документации тоже. ...

Жаль, что мы не можем нормализовать истину, чтобы она была очень истинной :-(

Водзуууу:
Да. Я знаю, что делает NormalizeDouble, я то, что я понимаю (если у меня есть: euro/usd = 1.2390022129.....09.... И нам нужно: 1,29893 end! не бесконечность), но я не могу написать это, может быть это?

Нет, вы не должны нормализовать Bid или Close[1]. Я имел в виду, что вы просто не должны сравнивать их на равенство.

Представьте:
Close[1] = 1.31933
New_Bar
Tick1, Bid = 1.31935
Тик2, Bid = 1.31934
Тик3, Bid = 1.31937
Тик4, Bid = 1.31937
Тик5, Bid = 1.31942


Ваш код действительно ищет тик, где Bid равен 1.31936

if( Bid==Close[1]+3*Point)

Вы пропустите свой сигнал. Этого не произойдет, если вы используете > .

Wodzuuuu:
Я могу иметь +1 без проблем result=OrderSend(Symbol(),OP_BUY,0.41,Ask, 1 ,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);

Это не делает его намного лучше. Все ваши расчеты в Points должны быть Pips, насколько я понимаю. Однако, у меня нет опыта работы с ECN брокерами, так что это может сработать.

Водзуууу:

Это не неправильно, но не идеально, и в худшем случае это не то, что вы хотите внутри цикла. Лучше всего, даже не начинайте использовать циклы от 0 до OrdersTotal. Читайте здесь: Циклы и закрытие или удаление заказов

ОЧЕНЬ ХОРОШАЯ СТАТЬЯ! Я должен прочитать их в самом начале :)

Согласен и есть еще много очень хороших статей, написанных тем же автором. Также книга - неплохое место для начала.

Водзуууу:

У меня Admiral Market Bid = 1,29000 Ask = 1,29001. Это проблема, которую я знаю, но у меня нет решения на данный момент, я не нашел хороший пример.

На сайте вашего брокера указано, что для EURUSD минимальный спред составляет 0,1. Средний спред составляет 0,5. <-- Это означает в пунктах! То есть 0,1 - это 1 пункт. 0,5 - это 5 пунктов.
Так что в вашем случае один пипс - это 10*пункт. Спред запутает все ваши мини-расчеты, где вы добавляете только 3 пункта к цене.
Наберите в поисковике "adjust for 5 digit broker" и вы найдете много примеров.

 

ПРИВЕТ :)

Если этот код был плох, потому что я передавал сигналы, то он улучшился.Я подумал , что проблема совсем в другом месте, а не в знаке равенства '=='......... '>=' лучше, конечно.

if( Bid==Close[1]+3*Point)
if( Bid>=Close[1]+MyPips*3)

Вопрос 1. Должен ли я использовать MyPips в свече, в этой функции? bool BULL4()

Проблема с цифрами.

Я нашел вот это

https://www.mql5.com/en/forum/140097 by WHRoeder

https://www.mql5.com/en/forum/123736 by WHRoeder

Что такое Digit ? в https://docs.mql4.com/predefined/variables/digits и https://docs.mql4.com/convert/doubletostr

Поскольку вы эксперт, я должен был сказать кое-что, это может быть важно.
Сейчас я используюплатформу MT4 и вижу 4 цифры после запятой (Bid-Ask= 0.0001 обычно). На данный момент мы запрограммировалина MQL4, пусть так и будет.
В MT5 я вижу5 цифр после запятой.разница между MQL4 иMQL5. На данный момент это различие не имеет для менязначения. Важно,чтобы наш советник работал хорошо.
Я не хочу в данный момент говорить об этом (если это не необходимо)
.

И Я НАПИСАЛ ПРОГРАММУ для меня это хорошо :) как насчет Вас?

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA1  2000        // blue starategy

//+------------------------------------------------------------------+
//| Check NEW BAR                                |
//+------------------------------------------------------------------+

// nothing yet, one moment

//+------------------------------------------------------------------+
//| These are adjusted for 5/4 digit brokers                           |
//+------------------------------------------------------------------+

double  MyPips;        // slippage and others

int init()
  {
    if (Digits == 5)    // Adjust for five (5) 
    {                
         MyPips=Point*10; 
    } 
    else                // Adjust for four (4, and ..)
    {
         MyPips=Point*1;  
    }
  }
 
//+------------------------------------------------------------------+
//| Calculate open positions    HOW MEANY OF THIS is open   |
//+------------------------------------------------------------------+

int OpenOrders_BULL4(string symbol)
  {
   int buys=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1)   
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
   return(buys);
  }
  
//+------------------------------------------------------------------+
//| Condition candle                                                 |
//+------------------------------------------------------------------+
bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
      {
         return(true);
      } 
   else
      {
         return(false);
      } 
   }

//+------------------------------------------------------------------+
//| Condition send buy                                                 |
//+------------------------------------------------------------------+
 
bool BULL4send()
   {
   if( Bid>=Close[1]+MyPips*3)
      {
         return(true);
      } 
    else
      {
        return(false);
      }
   }
 
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+

bool OpenBULL41()
  {
      int    result;

      result=OrderSend(Symbol(),OP_BUY,0.41,Ask,MyPips,Close[1]-25*MyPips,0,"",MAGICMA1,0,Blue);
      if(result>0)
           {
            if(OrderSelect(result,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
      else
         {
            Print("Error opening BUY order : ",GetLastError()); 
            return(false);
         }
      return(true);       
   }
   
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

bool CheckForCloseBULL4()
{
   int i;
   for(i=OrdersTotal()-1;i>=0;i--)
      if( ! OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) continue;
         if( OrderMagicNumber() == MAGICMA1 && OrderSymbol() == Symbol()  && OrderType() == OP_BUY )
            if(OrderOpenPrice()+8*MyPips < Ask) return(true);
            
   else return(false);
}

//+------------------------------------------------------------------+
//|  close                               |
//+------------------------------------------------------------------+

void CloseBULL4()
{
   int i;   
   for(i=OrdersTotal()-1;i>=0;i--)
      {
      if( ! OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) continue;  
   
      if( OrderMagicNumber() == MAGICMA1 && OrderSymbol() == Symbol()  && OrderType() == OP_BUY )  
   
         if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), MyPips*1,Black ) )               
            Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  
      } 
}

//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
// ----------------bull4
   if(BULL4() && BULL4send() && OpenOrders_BULL4(Symbol())==0)             

     {
       OpenBULL41();//do open buy position
     }
     
   if(CheckForCloseBULL4()==true && OpenOrders_BULL4(Symbol())==1) CloseBULL4();   
  }
//+------------------------------------------------------------------+