Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 112

 
Николай Цепелев:

Hallo. Ich habe in meinem EA die Berechnung des Loses wie folgt geschrieben:

lot=NormalizeDouble(AccountBalance()*risk/(SL*MarketInfo(Symbol(),MODE_TICKVALUE)),2);

Ziel ist es, unabhängig von der Kontowährung und dem Paar die richtige Losgröße für das gegebene Risiko und den Stop-Loss zu erhalten. DasRisiko wird als Prozentsatz der Verluste festgelegt, wenn der Stop Loss ausgelöst wird. Stop Loss SL in Pips (wobei Pips die kleinstmögliche Veränderung des Paarpreises ist). Ich werde diesen EA in einem echten Konto verwenden. Aber ich habe meine Zweifel. Wenn mir jemand von erfahreneren Programmierern sagen könnte, welche Fehler auftreten können, wäre ich sehr dankbar.
Strategie-Tester zuerst. Dann haben wir ein Demokonto. Und erst dann das richtige Konto. Um die Formel zu überprüfen, schreiben Sie ein Skript. Oder rechnen Sie es einfach auf einem Blatt Papier aus. Ich habe Balance=100, Risiko=0.1 SL=100, Tick=0.00001 Lot=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 Lot mehr als die Balance? Sollten wir die Hebelwirkung berücksichtigen?
 
STARIJ:
Erster Strategietester. Dann ein Demokonto. Und erst dann eine echte. Um die Formel zu überprüfen, schreiben Sie ein Skript. Oder rechnen Sie es einfach auf einem Blatt Papier aus. Ich habe Balance=100, Risiko=0.1 SL=100, Tick=0.00001 Lot=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 Lot mehr als die Balance? Sollten wir die Hebelwirkung berücksichtigen?

MarketInfo(Symbol(),MODE_TICKVALUE)) gibt nicht die minimale Tickgröße zurück. Das steht in der Hilfe:

Größe der minimalen Preisänderung des Instruments in der Einzahlungswährung.


Tatsächlich wird jedoch der Wert der minimalen Änderung des Symbolpreises in der Einzahlungswährung von 1 Lot des Kontrakts zurückgegeben.


In Ihrem Beispielwird MarketInfo(Symbol(),MODE_TICKVALUE)) 1 zurückgeben, und dann ist alles richtig. Ich habe es auf echten Dollar- und Rubelkonten ausprobiert und es funktioniert. Hier ist das Skript, mit dem ich das überprüft habe:

#property copyright "Copyright 2016, MetaQuotes Software Corp.

#property link "https://www.mql5.com"

#Eigenschaft Version "1.00"

#Eigenschaft streng

#property show_inputs

extern double risk=0.10;

extern int sl=1000;

//+------------------------------------------------------------------+

//| Skriptprogramm-Startfunktion |

//+------------------------------------------------------------------+

void OnStart()

{

Alert(NormalizeDouble(Kontostand()*Risiko/(sl*MarketInfo(Symbol(),MODE_TICKVALUE),2))

}

//+------------------------------------------------------------------+

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Библиотеки: Black or White Text Black or White Text...
 

Sie haben Recht. Die Prüfung mit einem Skript ist schneller und zuverlässiger

//+------------------------------------------------------------------+ 
//| Расчет лота                                                      | 
//+------------------------------------------------------------------+ 
#property strict
#property show_inputs
extern double risk=0.10;
extern int    sl  =100;
void OnStart() 
{ 
   Alert(MarketInfo(Symbol(),MODE_TICKVALUE), "   ",NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
 
Николай Цепелев:
Ihr Skript nimmt 19 cm in der Höhe auf dem Bildschirm ein, meines ist 8,1 cm - also halb so lang. Und die Farbe ist anders
 

Außerdem müssen wir die Genauigkeit der Funktion NormaliseDouble von der zulässigen Mindestmenge abhängig machen. Wenn Sie der Funktion OrderSend ein Lot übergeben, z. B. 0,11, und das Tool nur mit Lots von 0,1 gehandelt wird, tritt ein Fehler auf.

 

Ich kann nicht verstehen, warum offene Trades nicht alle auf einmal gelöscht werden, d.h. EA löscht einige von ihnen, aber der Fehler orderdelete 4108, market order kann nicht mehrmals gelöscht werden, und löscht sie erst dann.

  int start()                                     
  {
  
  while(!IsStopped())     
      {               

Refreshrates();

  
   if(cont==true&&NormalizeDouble(AccountProfit(),2)>=0)
    {
     for(i=1; i<=OrdersTotal(); i++)       
        { RefreshRates(); 
         if(OrderSelect(i-1,SELECT_BY_POS)==true
           {                                    
              while(OrderType()==OP_BUYLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
               }
              while(OrderType()==OP_BUY)
              {
               res=false;
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_BID),Slippage);  
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELLLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELL)
              {
               res=false;     
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_ASK),Slippage);
               if(res==true)
               break;
              }     
           }  
         }
}
}  
 
Yevgen Butov:

Ich kann nicht verstehen, warum offene Trades nicht alle auf einmal gelöscht werden, d.h. EA löscht einige von ihnen, aber der Fehler orderdelete 4108, market order kann nicht mehrmals gelöscht werden, und löscht sie erst dann.

Auf dieser Seite wird erklärt, wie Sie löschen können. Sie haben 2 Fehler.

 
Guten Tag. Ich bitte um Hilfe. Ich habe das NET und das Forum durchsucht. Ich teste den Expert Advisor im Standardmodus, alles ist OK... Keine Fehler oder Warnungen. Ich habe die Tickdaten heruntergeladen und hinzugefügt. (Ich habe alles wie hier beschrieben gemacht - Wie man Expert Advisors mit 99% Qualität testet - einfach, kostenlos, legal) und hier - "Wie man 99% Simulationsqualität im Metatrader 4 Strategy Tester erreicht") Beim Starten ständig Fehler 'array out of range in 'expert1.0.mq4' (69,25)... Ich verstehe, dass es sich um ein Array handelt. Ich weiß nicht, was ich tun soll. Aber da im Standardmodus alles in Ordnung ist... Bitte um Hilfe
 
qroner:
Beim Start gibt es einen konstanten Fehler array out of range in 'expert1.0.mq4' (69,25)... Ich habe verstanden, dass es um die Anordnung geht. Ich weiß nicht, was ich tun soll.

Ich muss den Code oder einen Teil davon sehen, der dieses Feld behandelt.

Telepathen, ruhen Sie sich heute aus.

 
Konstantin Nikitin:

Sie müssen sich den Code oder einen Teil des Codes ansehen, der das Array behandelt.

Telepathen, ruhen Sie sich heute aus.

void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){
ArrayInitialize(_Mas, 0);
int Ticket=-1;
for(int pos=OrdersTotal()-1; pos>=0; pos--){
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol&&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket){
Ticket=OrderTicket();
switch(OrderType()){
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}

}

Hier ist die Funktion.

Ich dachte nur, dass das Problem nicht im Code liegt, da im Standardmodus keine Fehler auftreten.