Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 827

 

Hilfe bei der Optimierung des Indikators - ich bekomme den letzten Balken nicht in den Griff!

Der Indikator berücksichtigt eine Reihe von kontinuierlichen Gewinne für binäre Optionen, unter Berücksichtigung, dass die Wette wird alle 2 Bars (dh nach einem - Gewinn/Verlust, warten Sie auf die aktuelle Bar), die externe Variable ist eine Preisanalyse der vorherigen Bar in einem Aufwärts-oder Abwärtskurs

Ich habe das Gefühl, es funktioniert, aber online die letzte Bar ist nicht korrekt berücksichtigt, und als Folge, wenn ich den Indikator auf M1 die Daten aus der Geschichte wird korrekt sein, aber alles online ist nicht korrekt berechnet, der Code:

//+------------------------------------------------------------------+
//|                                                         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);
  }
//+------------------------------------------------------------------+

vielen Dank im Voraus!

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Ошибки, баги, вопросы Ошибка после команды CopyClose...
 
Hallo! Bitte helfen Sie mir mit dem Modul Schließsignale. Was mache ich falsch?
Dateien:
 
yur4ik:
Hallo! Bitte helfen Sie mir mit dem Signalmodul zum Schließen von Positionen. Was mache ich falsch?

Ihre Datei ist das Modul SIGNAL. Im Expert Advisor-System ist es auf die gleiche Weise integriert wie das Modul SIGNALS des Indikators USER. Mit anderen Worten: Die von Ihrem Modul erzeugten Signale haben ein GEWICHT, und es kann vorkommen, dass dieses Gewicht nicht ausreicht, um das Signal auszulösen.


Sie müssen sich überlegen, wie Sie den Abschluss in Ihrem Fall am besten durchführen. Vielleicht sollten Sie dies nicht im Signalmodul tun

 
Vladimir Karputov:

Ihre Datei ist das Modul SIGNAL. Im Expert Advisor-System ist es auf die gleiche Weise integriert wie das Modul SIGNALS des USER-Indikators. Mit anderen Worten: Die von Ihrem Modul erzeugten Signale haben ein GEWICHT, und es kann vorkommen, dass dieses Gewicht nicht ausreicht, um das Signal auszulösen.


Sie müssen sich überlegen, wie Sie den Abschluss in Ihrem Fall am besten durchführen. In einem Signalmodul sollten Sie dies nicht tun.

Ich möchte, dass es als Signalmodul ausgeführt wird, das von einem Expert Advisor Generator erfasst werden kann. In dem Moment, in dem das Modul ausgelöst werden soll, geben LongCondition() und ShortCondition() im zweiten EA-Modul Nullwerte zurück - d.h. weight=0, verstehe ich das richtig? Dementsprechend muss das Gewicht dieses Moduls das Signal überwiegen, aber es funktioniert nicht. In CheckCloseLong() und CheckCloseShort() habe ich Print("-------------"); und Print(time_GMT_DST()); eingefügt, die bei normalem Betrieb des Moduls bei jedem Tick entsprechende Einträge in das Protokoll machen sollten. Die Einträge werden nicht vorgenommen; CheckCloseLong() und CheckCloseShort() werden nicht aufgerufen. Wo ist der Haken?

Ich bin natürlich ungeschickt, aber ich lerne es gerade.
 
yur4ik:

Ich würde es gerne in Form eines Signalmoduls haben, damit es durch den EA-Generator zusammengesetzt werden kann. In dem Moment, in dem das Modul ausgelöst werden soll, geben LongCondition() und ShortCondition() im zweiten Modul des EA Nullwerte zurück - d.h. weight=0, verstehe ich das richtig? Dementsprechend muss das Gewicht dieses Moduls das Signal überwiegen, aber es funktioniert nicht. In CheckCloseLong() und CheckCloseShort() habe ich Print("-------------"); und Print(time_GMT_DST()); eingefügt, die bei normalem Betrieb des Moduls bei jedem Tick entsprechende Einträge in das Protokoll machen sollten. Die Einträge werden nicht vorgenommen; CheckCloseLong() und CheckCloseShort() werden nicht aufgerufen. Wo ist der Haken?

Ich bin sicherlich eine ungeschickte Erklärung, aber ich lerne gerade

Methoden verwenden

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

Anstelle ihrer CheckCloseLong und CheckCloseShort.

 
fxsaber:

Ich danke Ihnen.

 

Hallo, können Sie mir sagen, wie man einen Zähler für verlorene Trades erstellt?
Der Expert Advisor analysiert den letzten Handel in der Historie - wenn er unrentabel ist, addiert er +1 zu der Variable, die die Anzahl der aufeinanderfolgenden Verlustgeschäfte darstellt.

Sobald ein gewinnbringendes Geschäft zustande kommt, muss die Variable auf Null zurückgesetzt werden.

 
Nikita Chernyshov:

Hallo, könnten Sie mir bitte sagen, wie man einen Zähler für Verlustgeschäfte erstellt?
Der Expert Advisor analysiert den letzten Handel in der Historie - wenn dieser ein Verlustgeschäft war, addiert er +1 zu der Variable, die die Anzahl der aufeinanderfolgenden Verlustgeschäfte darstellt.

Sobald ein profitables Geschäft zustande kommt, muss die Variable auf Null gesetzt werden.

Wir können die Arbeit mit der Handelshistorie ablehnen und nur mit OnTradeTransaction() arbeiten - dort werden wir ein Geschäft vom Typ "OUT" abfangen - d.h. es wird die Positionsschließung sein. Sobald dieser Handel gefunden ist, bestimmen wir, ob er profitabel oder unprofitabel war. Dementsprechend sollten die Zähler"Verluste" zurückgesetzt oder erhöht werden.

//+------------------------------------------------------------------+
//| 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++;
              }
           }
     }
  }
Und die Überprüfung in der Handelshistorie sollte in OnInit() erfolgen - einmal beim Start des Expert Advisors.
 

Hallo zusammen,

Können Sie mir sagen, wie ich das EA-Protokoll programmgesteuert löschen kann, bevor ich die Informationen darin anzeige :?

Nur über Win API?

Ich danke Ihnen!

 
Vitaliy Sendyaev:

Hallo zusammen,

Können Sie mir sagen, wie ich das EA-Protokoll programmgesteuert löschen kann, bevor ich die Informationen darin anzeige?

Nur über Win API?

Ich danke Ihnen!

Protokollierung nur über Win API.
Grund der Beschwerde: