MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1671

 
MakarFX # :

foo2가 true를 반환하면 여기에서 오류를 찾으십시오.

나는 조건과 레토르트 사이에 x를 출력하고 그것이 참일 때를 보지만, OnTick에서는 항상 거짓이다.
 
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
    ...
}

중복 코드를 제거했습니다.

 
Nerd Trader # :

중복 코드를 제거했습니다.

   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

항상 거짓

 
Nerd Trader # :

중복 코드를 제거했습니다.

아래로 이동

 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 # :

아래로 이동

xs 및 여기에 있지만 BEActivate()에서 100가지가 넘는 true 중 OnTick()에서 true가 세 번만 나타납니다. :)))
 
Nerd Trader # :
xs 및 여기에 있지만 BEActivate()에서 100가지가 넘는 true 중 OnTick()에서 true가 세 번만 나타납니다. :)))

그리고 또 다른 질문...

수업을 없애고 싶지 않으세요?

 
MakarFX # :

그리고 또 다른 질문...

수업을 없애고 싶지 않으세요?

그런 농담으로 내 뻐꾸기를 곧 제거 할 것입니다.
 
MakarFX # :

이것은 OnCalculate 없이 수행할 수 있습니다.

OnCalculate() 함수는 사용자 지정 표시기에서만 호출됩니다.

OnCalculate() 함수에 의해 표시되는 데이터가 필요합니다.

누군가 클래스를 통해 구현했을 수도 있습니다!
 
Mikhail Toptunov # :

OnCalculate() 함수 에 의해 표시되는 데이터가 필요합니다.

누군가 클래스를 통해 구현했을 수도 있습니다!

그게 무슨 뜻이야?

 

M15

안녕하세요. 문제를 해결하는 데 도움이 됩니다. M15 양초에서 여러 거래가 연속으로 열립니다.

하나 이상의 트랜잭션을 열지 않아야 합니다. 고문의 논리는 이전 주문이 닫힐 때까지 다음 주문이 열리지 않지만 때로는 일련의 거래가 긴 촛불에서 열리는 방식으로 배열됩니다. 이 상황을 방지하려면 코드에 무엇을 추가해야 합니까?

코드 스니펫:

 //+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
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 );
           }
        }
     }
  }