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

 
Nerd Trader # :

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

나는 이미 완전한 절망에 빠졌습니다. 심지어 OnTick에 전송된 순간에 변수의 인쇄를 추가했습니다... 그리고 도움이 되었다면 :) 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){
        ...
        ...
      }
    }
  }
     if (!is_be){
     Print ( "is_be return " ,is_be);
     return false ;
  }
   else {
     Print ( "is_be return " ,is_be);
     return true ;
  }
}

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

그게 무슨 뜻이야?

저는 지표를 Expert Advisor에 통합한 경험을 공유할 수 있는 사람을 찾고 있습니다.

다른 TF에서 이러한 데이터를 계산할 수 있습니다.

 const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],

클래스를 통해 구현한 사람이 있는지 궁금합니다.

지금은 수업의 논리를 파악하려고 노력하고 있습니다. 학습에 도움이 될 것입니다.

 
законопослушный гражданин # :

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

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

코드 스니펫:

bCheckOrders()에서 미결 주문뿐만 아니라 보류 주문(MODE_TRADES)도 반복합니다.
 
Nerd Trader # :

음... vOrderModify()의 iOTi에서는 항상 = 1이고 티켓은 없지만 OrderSend() 작업의 긍정적인 결과, 즉 값 "1"이 있습니다.


감사하다. 원래 코드는 내 것이 아니므로 불필요하게 변경하지 않습니다. 작동하고 작동합니다.

이것이 내 문제를 해결하는 데 어떻게 도움이 될까요?

 
законопослушный гражданин # :

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

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

코드 스니펫:

OnTick() 표시
 
Mikhail Toptunov # :
저는 지표를 Expert Advisor에 통합한 경험을 공유할 수 있는 사람을 찾고 있습니다.

다른 TF에서 이러한 데이터를 계산할 수 있습니다.

클래스를 통해 구현한 사람이 있는지 궁금합니다.

지금은 수업의 논리를 파악하려고 노력하고 있습니다. 학습에 도움이 될 것입니다.

rates_total = Bars
time[]      = Time[]
open[]      = Open[]
high[]      = High[]
low[]       = Low[]
close[]     = Close[]
 
MakarFX # :
OnTick() 표시
 void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
   if (bCheckOrders() == true )
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
       if (bSignalBuy() == true )
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

   if (GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*- 1 )
     {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
      CloseOrder();
     }
DrawLABEL( "lab_Take" , 1 , 5 , 0 ,Color(GetProfitFromStart()> 0 ,Lime,Red), StringConcatenate ( "Profit: " ,DoubleToStr(GetProfitFromStart(), 2 ),AC));
  }
 
законопослушный гражданин # :

감사하다. 원래 코드는 내 것이 아니므로 불필요하게 변경하지 않습니다. 작동하고 작동합니다.

이것이 내 문제를 해결하는 데 어떻게 도움이 될까요?

아니요, 실수를 했습니다. OrderSend()는 티켓 또는 -1을 반환하므로 모든 것이 문제가 없습니다.
 
законопослушный гражданин # :

이것을 시도하고 OnTick()에서 bCheckOrders()를 제거하고 강조 표시된 것으로 설정하십시오.

 void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если появился сигнал на покупку, то откроем ордер на покупку
       if (bSignalBuy() == true )
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

   if (GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*- 1 )
     {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
      CloseOrder();
     }
DrawLABEL( "lab_Take" , 1 , 5 , 0 ,Color(GetProfitFromStart()> 0 ,Lime,Red), StringConcatenate ( "Profit: " ,DoubleToStr(GetProfitFromStart(), 2 ),AC));
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Если нет открытых ордеров, то входим в условие
   if (bCheckOrders() == true )
     {
   // Тикет ордера
       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()
  {
// Если нет открытых ордеров, то входим в условие
   if (bCheckOrders() == true )
     {
   // Тикет ордера  
       int iOTi = 0 ;   
   
      iOTi = OrderSend ( Symbol (), OP_SELL, LOT(), Bid, Slippage, 0 , 0 , "" , Magic, 0 , clrNONE );
   
   // Проверим открылся ли ордер
       if (iOTi > 0 )
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
       else
   // Если нет, то получим ошибку
      vError( GetLastError ());
     }
  }
 
Nerd Trader # :
아니요, 실수를 했습니다. OrderSend()는 티켓 또는 -1을 반환하므로 모든 것이 문제가 없습니다.

잘.

나는 미래를 위해 공부할 것이다