MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1671

 
MakarFX # :

foo2 true değerini döndürürse, hatayı burada arayın

Koşul ve imbik arasına x yazdırırım ve ne zaman doğru olduğunu görürüm, ancak OnTick'te her zaman yanlıştır.
 
bool BESet( double sl = 0 , color arrow_color = 0 , string order_type = "" ){
   bool order = OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0 , arrow_color );
           if (!order) {
             ResetLastError ();
             Print ( "!Ошибка " ,order_type, ". Причина: " , GetLastError ());
             return false ;
          }
           else {
             return true ;
          }
}

bool BEActivate(){
   double unrealized_profit = 0 ;
   color arrow_color = 0 ;
   string order_type = "" ;
   double sl = 0 ;
   bool is_be = false ; // если объявить true, то в OnTick всегда будет возвращаться true

   if ( OrdersTotal () >= 1 ){
     for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--){
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == false ) continue ;
       if (OrderType() == OP_BUY){
         if (OrderStopLoss() > OrderOpenPrice()) continue ;
        unrealized_profit = NormalizeDouble ( MathAbs (OrderOpenPrice() - Ask)/ Point , 0 );
         if (unrealized_profit >= save_zone && Ask > OrderOpenPrice()){
           is_be = BESet( NormalizeDouble (OrderOpenPrice()+breakeven* Point , Digits ), clrGreenYellow , "Бай" );
           Print ( "BE " ,is_be);
        }
      }
       if (OrderType() == OP_SELL){
        ...
        ...
      }
    }
  }
   return is_be;
}

void OnTick ()
{
  last_time = iTime ( NULL , 0 , 0 );
   bool is_be = BEActivate();

   if (last_time > bar.time_open){
    bar.Initialize();
     P r int ( "is_be " ,is_be); //Всегда FALSE
    ...
}

Fazlalık kod kaldırıldı.

 
Nerd Trader # :

Fazlalık kod kaldırıldı.

   last_time = iTime ( NULL , 0 , 0 );
   bool is_be = BEActivate();

   if ( last_time > bar.time_open ){
    bar.Initialize();
     P r int ( "is_be " ,is_be); //Всегда FALSE

her zaman yanlış

 
Nerd Trader # :

Fazlalık kod kaldırıldı.

Aşağı inmek

 void OnTick ()
{
   bool is_be = BEActivate();

   if (last_time > bar.time_open){
    bar.Initialize();
     Print ( "is_be " ,is_be); //Всегда FALSE
    ...
   last_time = iTime ( NULL , 0 , 0 );
}
 
MakarFX # :

Aşağı inmek

xs ve işte burada, ancak BEActivate'de () yüzden fazla true arasından, OnTick'te () true yalnızca üç kez göründü :)))
 
Nerd Trader # :
xs ve işte burada, ancak BEActivate'de () yüzden fazla true arasından, OnTick'te () true yalnızca üç kez göründü :)))

ve bir soru daha...

Derslerden kurtulmak istemiyor musun?

 
MakarFX # :

ve bir soru daha...

Derslerden kurtulmak istemiyor musun?

Yakında böyle şakalarla kendi guguk kuşumdan kurtulacağım
 
MakarFX # :

Bu OnCalculate olmadan yapılabilir

OnCalculate() işlevi yalnızca özel göstergelerde çağrılır

OnCalculate() işlevi tarafından görüntülenen verilere ihtiyacım var.

Belki birisinin sınıflar aracılığıyla bir uygulaması vardır!
 
Mikhail Toptunov # :

OnCalculate() işlevi tarafından görüntülenen verilere ihtiyacım var.

Belki birisinin sınıflar aracılığıyla bir uygulaması vardır!

Bu ne anlama geliyor?

 

M15

Tünaydın. sorunu çözmeye yardımcı olun. M15 mumunda arka arkaya birkaç anlaşma açılır.

Birden fazla işlemin açılmaması gerekmektedir. Danışmanın mantığı, bir önceki sipariş kapanana kadar bir sonraki açılmayacak şekilde düzenlenmiştir, ancak bazen bu kadar uzun bir mum üzerinde bir dizi işlem açılır. Bu durumu önlemek için koda ne eklenmeli?

kod parçacığı:

 //+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
bool bCheckOrders()
  {
// Переберем в цикле ордера, для проверки открытых ордеров данным советником

   for ( int i = 0 ; i <= OrdersTotal (); i++)
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
             return ( false );

   return ( true );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if (dMA > Open[ 1 ] && dMA < Close[ 1 ])   //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
       return ( true );

   return ( false );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if (dMA < Open[ 1 ] && dMA > Close[ 1 ])
       return ( true );

   return ( false );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Тикет ордера
   int iOTi = 0 ;   

   iOTi = OrderSend ( Symbol (), OP_BUY, LOT(), Ask, Slippage, 0 , 0 , "" , Magic, 0 , clrNONE );

// Проверим открылся ли ордер
   if (iOTi > 0 )
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError( GetLastError ());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Тикет ордера  
   int iOTi = 0 ;   

   iOTi = OrderSend ( Symbol (), OP_SELL, LOT(), Bid, Slippage, 0 , 0 , "" , Magic, 0 , clrNONE );

// Проверим открылся ли ордер
   if (iOTi > 0 )
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError( GetLastError ());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify( int iOTi)
  {
   int     iOTy = - 1 ;     // Тип ордера
   double dOOP = 0 ;     // Цена открытия ордера
   double dOSL = 0 ;     // Стоп Лосс
   int     iMag = 0 ;     // Идентификатор советника
   double dSL  = 0 ;     // Уровень убытка
   double dTP  = 0 ;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if ( OrderSelect (iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if (OrderSymbol() == Symbol () && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
       if (dOSL == 0 )
        {
         if (iOTy == OP_BUY)
           {
            dSL = NormalizeDouble (dOOP - StopLoss * Point , Digits );
            dTP = NormalizeDouble (dOOP + TakeProfit * Point , Digits );

             bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0 , clrNONE );
           }

         if (iOTy == OP_SELL)
           {
            dSL = NormalizeDouble (dOOP + StopLoss * Point , Digits );
            dTP = NormalizeDouble (dOOP - TakeProfit * Point , Digits );

             bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0 , clrNONE );
           }
        }
     }
  }