Gemeinsam lernen und schreiben in MQL5 - Seite 24

 

Was macht diese Funktion, die für jeden klar ist?

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest my_trade;

MqlTradeResult my_trade_result;

my_trade.action=TRADE_ACTION_DEAL;

my_trade.symbol=Symbol();

my_trade.volume=NormalizeDouble(volume,1);

my_trade.price=NormalizeDouble(Bid,_Digits);

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits);

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);

my_trade.deviation=slippage;

my_trade.type=ORDER_TYPE_SELL;

my_trade.type_filling=ORDER_FILLING_AON;

my_trade.comment=Kommentar;

my_trade.magic=magic;


ResetLastError();

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal();

md=0;

Print( "Operation result code - " ,my_trade_result.retcode);

}

sonst

{

Print("Operation result code - ",my_trade_result.retcode);

Print("Fehler beim Öffnen der Bestellung = ",GetLastError());

}

zurück(0);

}

In der Prozedur OnTick()

...

OpenSell(Lots,10, "EUR/USD (Sell)",102406);

...

Ganz am Anfang:

double StopLoss=250,

TakeProfit=1400;

extern double Lots = 0.1;

Warum zum Teufel stehen 220 Dollar in den Testergebnissen?

<DATUM> <SALDO> <EIGENKAPITAL> <MARGENHÖHE

01,01,2010 0 :00:00 10000 10000 0

11,01,2010 2 :57:00 9779,29 9841,92 6827

15,01,2010 16:00:00 9829,8 9941,9 6857

22,01,2010 14:32:00 10124,1 10135,9 7167

26,01,2010 2 :14:00 10048,6 10048,6 0

26,01,2010 4 :06:00 10048,6 10038,4 7099

27,01,2010 21:12:00 10188,5 10188,5 0

29,01,2010 2 :16:00 10188,5 10308 7346

29,01,2010 7 :14:00 10188,5 10277,4 7324

04,02,2010 22:05:00 10418,63 10480,83 7592


Wenn ich mich irre, gib mir einen Klaps auf die Nase.

Ich werde nicht zulassen, dass Sie den ganzen EA sehen. Die Funktion bei Kaufen ist ähnlich...

Ich schließe die Position mit dem entgegengesetzten Auftrag.

 

Also gut. Ich habe mir die Seele aus dem Leib geschrien. Ich lerne gerade die Sprache. Wenn ich jemanden beleidigt habe, entschuldige ich mich. Ich werde arbeiten und nach dem Problem suchen. Ich habe es wahrscheinlich selbst getan, aber ich möchte wirklich lernen, wie man gute EAs mit mql5 macht. Es ist ein sehr gutes System, aber . Ich habe bisher Probleme damit.

Obwohl ich 20 Expert Advisors auf mql4 ohne Probleme habe.

 
Khomtchenko:
...
Es wäre besser, die Transaktionshistorie für den fraglichen Zeitraum anzugeben, als diese unbekannten Zahlen. Dann wird es vielleicht klarer, woher der Verlust kommt.
 

Ich habe begonnen, den Abschnitt "Dateioperationen" nach und nach zu studieren. Wissen Sie, ob es Anleitungen für die Arbeit mit Dateien in MQL5 gibt?

 

Wie kann ich alle Aufträge mit einem bestimmten Modus löschen?

Ich habe zwei Funktionen dafür, check_orders prüft auf Aufträge mit einem bestimmten Modus, und remove_sl löscht sie:

void remove_sl()
     {
      int counter01;
      ulong counter02;
      while(check_orders()==true)
        {
         for(counter01=0; counter01<OrdersTotal(); counter01++)
           {
            counter02=OrderGetTicket(counter01);
            if(OrderGetInteger(ORDER_MAGIC)!=magick)
               continue;
            remove_request.action=TRADE_ACTION_REMOVE; remove_request.order=counter02;
            if(OrderCheck(start_request,check_result)==true)
               OrderSend(start_request,trade_result);
           }
        }
     }



bool check_orders()
     {
      int counter01;
      bool order_exist=false;
      for(counter01=0; counter01<OrdersTotal(); counter01++)
        {
         OrderGetTicket(counter01);
         if(OrderGetInteger(ORDER_MAGIC)==magick)
           {
            order_exist=true;
            break;
           }
        }
      return(order_exist);
 

Das Problem ist, dass diese Zeilen im Tagebuch von EA erscheinen:

2011.05.11 21:40:19 Trades '726238' : fehlgeschlagene Stornierung der Order #4375237 buy 0.00 at 0.00000 [Ungültige Anfrage]
D.h. es gibt redundante Anfragen an den Handelsserver, um den Auftrag zu löschen, der bereits gesendet wurde.

 

Ich glaube, ich habe ein Problem mit dem Schließen und Öffnen von Positionen.

Anstatt eine Position für 0,1 Lot zu haben, habe ich in Wirklichkeit mehrere Lots. Offensichtlich überschneiden sich die Positionen eines Symbols und das Volumen der Position wächst. Nur so lassen sich die oben erwähnten Probleme mit großen Stoppwerten und großen Unterschieden beim Testen erklären. Das bedeutet, dass ich das Vorhandensein von offenen Geschäften falsch analysiere oder die Trails falsch schließe.

Dies ist das Verfahren, mit dem ich feststelle, ob es eine offene Position bei einem Symbol gibt:

int Total()

{

count=0;

for (i=0; i<=PositionsTotal(); i++)

{

if (PositionGetSymbol(i)==_Symbol) {count++;}

}

return(count);

}

Natürlich gibt die Funktion entweder 0 oder 1 zurück.

Ich verwende die folgende Eingabe, um Aufträge zu eröffnen

wenn (Gesamt()<1)

{

if (# Überprüfung von Indikatoren#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406);

if (#Überprüfung der Indikatoren#) OpenSell(Lots,10, "EUR/USD (Sell)",102406);

}

Ich eröffne Kauf und Verkauf, wie es aussieht:

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest my_trade;

MqlTradeResult my_trade_result;

my_trade.action=TRADE_ACTION_DEAL;

my_trade.symbol=Symbol();

my_trade.volume=NormalizeDouble(volume,1);

my_trade.price=NormalizeDouble(Bid,_Digits);

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits);

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);

my_trade.deviation=slippage;

my_trade.type=ORDER_TYPE_SELL;

my_trade.type_filling=ORDER_FILLING_AON;

my_trade.comment=Kommentar;

my_trade.magic=magic;


ResetLastError();

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal();

md=0;

Print( "Operation result code - " ,my_trade_result.retcode);

}

sonst

{

Print("Operation result code - ",my_trade_result.retcode);

Print("Fehler beim Öffnen der Bestellung = ",GetLastError());

}

zurück(0);

}

Ich schließe die Geschäfte im Hauptverfahren auf die gleiche Weise ab:

wenn (Gesamt()>0) TryToClose();

TryToClose funktioniert so:

int TryToClose()
{
for (i=0; i<=PositionsTotal(); i++)
{
wenn (PositionGetSymbol(i)==_Symbol)
{
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
if(# Überprüfung eines Indikators#) OpenSell(Lots,10, "EUR/USD (Sell)",102406)
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
if(# some indicator check#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406);
}
}
zurück(0);

}

Der Indikator prüft, ob es eine Kaufposition geben sollte und ob es eine Verkaufsposition gibt, dann wird ein Kauf getätigt.

Hier habe ich einen Fehler gemacht. Warum bekomme ich vergrößerte Positionen?

 
Khomtchenko:

Fügen Sie den Code über die Schaltfläche SRC ein

Будет читабельнее
Kennen Sie den Unterschied zwischen einem MT4-Auftrag und einem MT5-Auftrag?
 

In mql4 sind Aufträge entweder im Handel oder in der Schwebe.

In mql5 ist ein Auftrag ein schwebender Handel. Der Markteintritt bedeutet die Eröffnung einer Position. Wenn der Auftrag ausgelöst wird, wird eine Position eröffnet. Es kann nur eine Position für ein Symbol geben, und es kann so viele Aufträge geben, wie wir wollen.

Спасибо за подсказку
 

Jeder deutet mir ständig an, dass ich dumm bin. Ich bin vielleicht dumm. Nun, finden Sie meine Fehler, damit ich sie korrigieren kann.

 
Khomtchenko:

Das sind alles Anspielungen auf Dummheit. Ich bin vielleicht dumm. Nun, finden Sie meine Fehler, damit ich sie korrigieren kann.

Ich will damit nichts andeuten, ich bin nur vorbeigekommen und habe gefragt, was der häufigste Grund dafür ist, ich kenne Ihren Ausbildungsstand nicht.

Ich bin schon lange hier, ich habe mir schon eine Meinung über viele Leute gebildet (jeder ist auf seine Weise stark), ich kenne dich noch nicht, also werde ich nichts andeuten.


Ich sehe das große Ganze der Strategie nicht. Nach der Art und Weise zu urteilen, wie Sie die Positionen durchgehen, handelt es sich um eine Mehrwährungsstrategie.

Aber Sie haben nur ein Werkzeug vorgeschrieben. Wenn das Werkzeug ein einziges ist, warum sollten Sie die Positionen durchlaufen?

Wenn Sie das Instrument kennen, brauchen Sie nicht alle Positionen zu durchsuchen, um sie zu finden, Sie brauchen nur diese Funktion zu verwenden:

bool  PositionSelect(
   string  symbol     // имя инструмента
   );
Grund der Beschwerde: