초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 827

 

표시 수정을 도와주세요 - 마지막 막대를 알 수 없습니다!

표시기는 2개의 막대마다 베팅이 이루어진다는 사실을 고려하여 바이너리 옵션에 대한 일련의 연속 승리를 계산합니다(즉, 1개의 원/실패 후 현재 막대를 기다림). 외부 변수는 다음 분석입니다. 가격 인상 또는 하락을 위한 이전 막대의 가격

모든 것이 작동하는 것 같지만 온라인 마지막 막대가 잘못 계산되어 결과적으로 M1에 표시기를 넣으면 기록의 데이터가 올바르게 계산되고 온라인에서 계산된 모든 것이 더 이상 정확하지 않습니다. 코드:

 //+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
#property indicator_label1    "Label1"
#property indicator_type1    DRAW_HISTOGRAM
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    4
#property indicator_level1    2
#property indicator_level2    4
#property indicator_level3    6
//--- input parameters
input bool      on_a_higher= true ;
//--- indicator buffers
double          Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int count;
bool win;
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Label1Buffer, INDICATOR_DATA );
   count = 0 ;
   win = false ;
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {
//---
       int start;
       if (prev_calculated==rates_total) return (rates_total);
       if (prev_calculated== 0 ) start= 1 ; else start=prev_calculated- 1 ;
       for ( int i=start;i<rates_total;i++){
             if (win){   // признак выигрыша на предыдущей ставке
                  win = false ;
                  Label1Buffer[i]=count;
            }
             else {
                   if (on_a_higher){     // on_a_higher = true - расчитываем на рост цены относительно предидущего бара
                     if (price[i]>price[i- 1 ]){
                           count++;
                           win = true ;
                     } else {
                                 count = 0 ;
                                 win = false ;
                     }
                  Label1Buffer[i]=count;
                  } else {               // on_a_higher = false - расчитываем на падение цены относительно предидущего бара
                         if (price[i]<price[i- 1 ]){
                           count++;
                           win = true ;
                     } else {
                                 count = 0 ;
                                 win = false ;
                     }
                  Label1Buffer[i]=count;
                  }
            }
      }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

미리 감사합니다!

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Ошибки, баги, вопросы Ошибка после команды CopyClose...
 
안녕하세요! 포지션 청산을 위한 시그널 모듈을 도와주세요. 내가 무엇을 잘못하고 있지?
파일:
 
yur4ik :
안녕하세요! 포지션 청산을 위한 시그널 모듈을 도와주세요. 내가 무엇을 잘못하고 있지?

귀하의 파일은 SIGNALS 모듈입니다. Expert Advisor 시스템에서 USER 인디케이터의 SIGNALS 모듈과 동일한 방식으로 구축됩니다. 즉, 모듈에서 생성된 신호에는 가중치가 있으며 이 가중치가 신호를 트리거하기에 충분하지 않을 수 있습니다.


귀하의 케이스와 관련하여 종결을 가장 잘 수행하는 방법에 대해 생각할 필요가 있습니다. 아마도 이것은 신호 모듈에서 수행되지 않아야 합니다.

 
Vladimir Karputov :

귀하의 파일은 SIGNALS 모듈입니다. Expert Advisor 시스템에서 USER 인디케이터의 SIGNALS 모듈과 동일한 방식으로 구축됩니다. 즉, 모듈에서 생성된 신호에는 가중치가 있으며 이 가중치가 신호를 트리거하기에 충분하지 않을 수 있습니다.


귀하의 케이스와 관련하여 종결을 가장 잘 수행하는 방법에 대해 생각할 필요가 있습니다. 아마도 이것은 신호 모듈에서 수행되지 않아야 합니다.

어드바이저의 생성기를 통해 수집이 가능하도록 신호 모듈의 형태로 하는 것이 바람직할 것이다. 이 모듈이 실행되어야 하는 순간에 어드바이저의 두 번째 모듈에 있는 LongCondition() 및 ShortCondition()이 0 값을 반환합니다. 즉, weight=0인데 제가 제대로 이해하고 있는 건가요? 따라서 이 모듈의 신호의 무게가 더 커야 하지만 작동하지 않습니다. CheckCloseLong() 및 CheckCloseShort()에서 Print("------------"); 및 Print(time_GMT_DST()); 모듈이 정상적으로 작동하는 동안 각 틱 을 수신할 때 적절한 로그 항목을 작성해야 하는 항목을 올바르게 이해하고 있습니까? 항목이 작성되지 않고 CheckCloseLong() 및 CheckCloseShort()가 호출되지 않습니다. 캐치 뭔데?

물론 서툴게 설명하지만 배우는 중일 뿐
 
yur4ik :

어드바이저의 생성기를 통해 수집이 가능하도록 신호 모듈의 형태로 하는 것이 바람직할 것이다. 이 모듈이 실행되어야 하는 순간에 어드바이저의 두 번째 모듈에 있는 LongCondition() 및 ShortCondition()이 0 값을 반환합니다. 즉, weight=0인데 제가 제대로 이해하고 있는 건가요? 따라서 이 모듈의 신호의 무게가 더 커야 하지만 작동하지 않습니다. CheckCloseLong() 및 CheckCloseShort()에서 Print("------------"); 및 Print(time_GMT_DST()); 모듈의 정상적인 작동 중에 각 틱 이 도착할 때 로그에 적절한 항목을 작성해야 하는 항목을 올바르게 이해하고 있습니까? 항목이 작성되지 않고 CheckCloseLong() 및 CheckCloseShort()가 호출되지 않습니다. 캐치 뭔데?

물론 서툴게 설명하지만 배우는 중일 뿐

사용 방법

   //--- methods of checking if the market models are formed
   virtual int        LongCondition( void );
   virtual int        ShortCondition( void );

CheckCloseLong 및 CheckCloseShort 대신.

 
fxsaber :

고맙습니다.

 

안녕하세요, 거래 손실 카운터를 만드는 방법을 알려주세요?
EA는 기록의 마지막 거래를 분석합니다. 수익이 없으면 변수에 +1을 추가합니다. 이 값은 연속적으로 수익이 나지 않는 거래의 수입니다.

수익성 있는 거래가 발생하자마자 변수는 0으로 재설정되어야 합니다.

 
Nikita Chernyshov :

안녕하세요, 거래 손실 카운터를 만드는 방법을 알려주십시오.
EA는 기록의 마지막 거래를 분석합니다. 수익성이 없으면 변수에 +1을 추가하며, 이는 연속적으로 수익성이 없는 거래의 수입니다.

수익성 있는 거래가 발생하자마자 변수는 0으로 재설정되어야 합니다.

거래 내역에 대한 작업을 거부하고 OnTradeTransaction() 에서만 작업할 수 있습니다. 거기에서 "OUT" 유형으로 거래를 잡을 수 있습니다. 즉, 이는 포지션을 마감하는 것입니다. 그러한 거래가 발견되자마자 우리는 그것이 수익성이 있었는지 또는 수익성이 없었는지 판단합니다. 따라서 " 손실 " 카운터가 재설정되거나 증가됩니다.

 //+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if (type== TRADE_TRANSACTION_DEAL_ADD )
     {
       long      deal_ticket       = 0 ;
       long      deal_order        = 0 ;
       long      deal_time         = 0 ;
       long      deal_time_msc     = 0 ;
       long      deal_type         =- 1 ;
       long      deal_entry        =- 1 ;
       long      deal_magic        = 0 ;
       long      deal_reason       =- 1 ;
       long      deal_position_id  = 0 ;
       double    deal_volume       = 0.0 ;
       double    deal_price        = 0.0 ;
       double    deal_commission   = 0.0 ;
       double    deal_swap         = 0.0 ;
       double    deal_profit       = 0.0 ;
       string    deal_symbol       = "" ;
       string    deal_comment      = "" ;
       string    deal_external_id  = "" ;
       if ( HistoryDealSelect (trans.deal))
        {
         deal_ticket       = HistoryDealGetInteger (trans.deal, DEAL_TICKET );
         deal_order        = HistoryDealGetInteger (trans.deal, DEAL_ORDER );
         deal_time         = HistoryDealGetInteger (trans.deal, DEAL_TIME );
         deal_time_msc     = HistoryDealGetInteger (trans.deal, DEAL_TIME_MSC );
         deal_type         = HistoryDealGetInteger (trans.deal, DEAL_TYPE );
         deal_entry        = HistoryDealGetInteger (trans.deal, DEAL_ENTRY );
         deal_magic        = HistoryDealGetInteger (trans.deal, DEAL_MAGIC );
         deal_reason       = HistoryDealGetInteger (trans.deal, DEAL_REASON );
         deal_position_id  = HistoryDealGetInteger (trans.deal, DEAL_POSITION_ID );

         deal_volume       = HistoryDealGetDouble (trans.deal, DEAL_VOLUME );
         deal_price        = HistoryDealGetDouble (trans.deal, DEAL_PRICE );
         deal_commission   = HistoryDealGetDouble (trans.deal, DEAL_COMMISSION );
         deal_swap         = HistoryDealGetDouble (trans.deal, DEAL_SWAP );
         deal_profit       = HistoryDealGetDouble (trans.deal, DEAL_PROFIT );

         deal_symbol       = HistoryDealGetString (trans.deal, DEAL_SYMBOL );
         deal_comment      = HistoryDealGetString (trans.deal, DEAL_COMMENT );
         deal_external_id  = HistoryDealGetString (trans.deal, DEAL_EXTERNAL_ID );
        }
       else
         return ;
       if (deal_symbol== Symbol () && deal_magic==m_magic)
         if (deal_entry== DEAL_ENTRY_OUT )
           {
             if (deal_commission+deal_swap+deal_profit> 0 )
              {
               losses= 0 ;
              }
             else
              {
               losses++;
              }
           }
     }
  }
그리고 OnInit()에서 수행할 거래 내역을 확인하십시오 - 어드바이저 시작 시 한 번.
 

여보세요,

정보를 표시하기 전에 전문가 로그를 프로그래밍 방식으로 지우는 방법을 알려주실 수 있습니까?

Win API를 통해서만?

고맙습니다!

 
Vitaliy Sendyaev :

여보세요,

정보를 표시하기 전에 전문가 로그를 프로그래밍 방식으로 지우는 방법을 알려주실 수 있습니까?

Win API를 통해서만?

고맙습니다!

Win API를 통해서만 기록하십시오.
사유: