初学者的问题 MQL5 MT5 MetaTrader 5 - 页 827

 

帮助调整指标--无法掌握最后一栏的情况!

该指标考虑到二元期权的一系列连续胜利,考虑到每2个条形图将进行投注(即在一个 - 赢/输后,等待当前条形图),外部变量是前一个条形图的价格分析,在一个向上或向下的价格

我感觉它是有效的,但在网上,最后一个条形图没有被正确考虑,因此,如果我把指标放在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:
你好!请帮助我处理平仓 的信号模块。我做错了什么?

你的文件是SIGNAL模块。在专家顾问系统中,它与USER指标的SIGNALS模块以同样的方式整合。换句话说,你的模块产生的信号有一个重量,可能会出现这个重量不足以触发信号的情况。


你需要考虑在你的案件中进行结案的最佳方式。也许你不应该在信号模块中这样做

 
Vladimir Karputov:

你的文件是SIGNAL模块。在专家顾问系统中,它与USER指标的SIGNALS模块以同样的方式整合。换句话说,你的模块产生的信号有一个重量,可能会出现这个重量不足以触发信号的情况。


你需要考虑在你的案件中进行结案的最佳方式。你可能不希望在信号模块中这样做。

我希望它能作为一个信号模块来完成,可以由专家顾问生成器收集。在模块要被触发的那一刻,第二个EA模块中的LongCondition()和ShortCondition()返回零值--即权重=0,我的理解是否正确?相应地,这个模块的重量必须超过信号,但它并没有发挥作用。在CheckCloseLong()和CheckCloseShort()中,我插入了Print("-------------");和Print(time_GMT_DST());,在正常的模块操作中,应该在收到每个tick 时在日志中做出适当的记录。不进行输入;CheckCloseLong()和CheckCloseShort()不被调用。有什么好处呢?

当然,我很笨拙,但我只是在学习。
 
yur4ik:

我希望它能以信号模块的形式出现,这样就可以通过EA生成器来收集。在模块被触发的那一刻,EA第二个模块中的LongCondition()和ShortCondition()返回零值--即权重=0,我的理解是否正确?相应地,这个模块的重量必须超过信号,但它并不工作。在CheckCloseLong()和CheckCloseShort()中,我插入了Print("-------------");和Print(time_GMT_DST());,在正常的模块操作中,应该在收到每个tick 时在日志中做出适当的记录。不进行输入;CheckCloseLong()和CheckCloseShort()不被调用。有什么好处呢?

我当然是一个笨拙的解释,但我只是在学习。

使用方法

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

而不是他们的CheckCloseLong和CheckCloseShort。

 
fxsaber:

谢谢你。

 

你好,你能告诉我如何为亏损的交易制作一个计数器吗?
专家顾问分析历史上的最后一笔交易--如果它是无利可图的,那么它就给变量加上+1,这将是连续亏损交易的数量。

一旦有盈利的交易出现--该变量需要被重置为零。

 
Nikita Chernyshov:

你好,请问如何为亏损的交易做一个计数器?
专家顾问分析历史上的最后一笔交易--如果它是亏损的,那么它就在变量上加+1,这将是连续亏损的交易数量。

一旦有利可图的交易到来,该变量就必须被归零。

我们可以拒绝使用交易历史,而只使用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()中进行--在专家顾问启动时进行一次。
 

大家好。

你能告诉我如何在显示EA日志的信息之前以编程方式清除它吗?

只通过Win API?

谢谢你!

 
Vitaliy Sendyaev:

大家好。

你能告诉我如何在显示EA日志的信息之前以编程方式清除它吗?

只通过Win API?

谢谢你!

只通过Win API记录。