Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 833

 
Igor Zakharov:

Korrigiert... Aber aus irgendeinem Grund ist einer übrig geblieben.



Und ich kann es im Testgerät nicht reproduzieren. Ich habe sie nur nicht am selben Tag.


 

Warum kann ich die Bibliothek in mql4 nicht von C++ aus verbinden? Hier ist mein Code in Visual Studio 2012 C++. Datei main. mit der Erweiterung cpp (main.csr)

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

Dann habe ich eine Datei mit der Haupterweiterung def (main.def) erstellt, die eine Liste der exportierten Funktionen enthält; der Code sieht wie folgt aus:

LIBRARY "dllmt42"
EXPORTS
add

Dann habe ich es in den Compiler importiert

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

Keine Probleme nach der Kompilierung, aber wenn Sie den EA auf dem Diagramm zu verlassen, bekomme ich verwirrt

Unaufgelöster Importfunktionsaufruf, Suche nach '_add' in 'dllmt42.dll'. Total Comander sieht beim Ziehen der Datei sowohl die Funktion als auch den Compiler selbst

Wer kann helfen?

 
Alexandr Sokolov:

Korrigiert... Aber aus irgendeinem Grund ist einer übrig geblieben.

Und ich kann es im Testgerät nicht reproduzieren. Ich habe diesen Fehler am gleichen Tag nicht

Dieser Fehler zeigt an, dass Sie versuchen, eine Position/Auftrag zu dem Preis zu ändern, zu dem Sie die Änderung zuvor vorgenommen haben...

 

Ich versuche, Indikatordaten in MT5 mit einer Funktion abzurufen:

//************************************************************************************************/
double Envelopes(string symb, ENUM_TIMEFRAMES TF_1, int period, int method, int shift, int price,double Deviation(ENUM_TIMEFRAMES TF_2, int kanal), int buff, int index)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TF_1, period, method, shift, price, Deviation(TF_2, kanal), buff);
   if(handle<0)
   {
    Print("Failed to create handle ATR, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,0,index,1,buf)<0)
    {
     Print("Failed to copy data from the indicator ATR, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Ich erhalte eine Fehlermeldung:


Bitte empfehlen Sie, wie man den Code für MT5 repariert

 
Vladimir Pastushak:

Dieser Fehler deutet darauf hin, dass Sie versuchen, eine Position/Order zu dem Preis zu ändern, zu dem Sie sie bereits geändert haben...

Nein, ich habe es schon mehrmals überprüft, das Problem lag in der Zufälligkeit der Auswahl der Eingabeparameter von MQL beim Testen der Produkte, die nicht immer kompatibel sind - auch das habe ich behoben. Aber jetzt erhalte ich die Meldung, dass es keinen offenen Auftrag gibt.


Obwohl ich sie für dieselben Paare und Zeitrahmen habe

 
Alexandr Sokolov:

Das Problem lag in der Zufälligkeit der Auswahl der Eingabeparameter von MQL beim Testen der Produkte, die nicht immer kompatibel sind - auch das habe ich bereits behoben. Aber jetzt erhalte ich die Meldung, dass es keinen offenen Auftrag gibt.


Aber ich habe sie auf die gleichen Paare und Zeitrahmen

Ich weiß nicht, warum mein EA nicht handelt.

 
Vladimir Pastushak:

Finden Sie heraus, warum der EA nicht handelt.

Es darf nicht gehandelt werden, wenn die Eingangsparameter zufällig gewählt sind, so dass Signale einfach nicht auftreten. Sie sollten es aber auch nicht einschränken

 

Was versteht man unter dem Begriff" TradingFreeze Distance "? Empfangen durch

SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL)

MQL4

 

Ich habe wieder Fehler Nr. 1 beim Ändern. In diesem EA werden die SL- oder TP-Levels nur in vier Blöcken geändert


1 Block

if(OrderMagicNumber() == id_number && OrderStopLoss() != NormalizeDouble(0,_Digits) && BMod(OrderTicket()) == true)
           {
            if(OrderType() == OP_BUY)
              {
               if(OrderComment() == "1" && Bid - OrderOpenPrice() >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && Bid - OrderOpenPrice() >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              }
            else
              {
               if(OrderComment() == "1" && OrderOpenPrice() - Ask >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && OrderOpenPrice() - Ask >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              };


2 Block

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() - sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


3 Block

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


4 Block

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && OrderTakeProfit() == NormalizeDouble(0,_Digits))
              {
               if(MyOrders() == 1)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
                 }
               else if(OrderTakeProfit() == 0)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + (OrderComment() == "1" ? t1 : t2) : OrderOpenPrice() - (OrderComment() == "1" ? t1 : t2)),0,clrNONE);
                 };


Ich habe bereits alles mehrmals überprüft, aber ich kann keine Fehler finden

 
Alexandr Sokolov:

Ich habe wieder Fehler Nr. 1 beim Ändern. In diesem EA werden die SL- oder TP-Levels nur in vier Blöcken geändert



OrderStopLoss() != NormalizeDouble(0,_Digits)


Dies ist nicht korrekt, auch in anderen Beispielen

Wenn Sie einen Stopp bei 1,2356 setzen und bei einem neuen Tick wieder einen Stopp bei 1,2356 setzen, erhalten Sie Fehler 1

Grund der Beschwerde: