Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 833

 
Igor Zakharov:

Corretto... Ma ne è rimasto uno per qualche motivo.



E non posso riprodurlo nel tester. Solo che non ce l'ho nella stessa data


 

Perché non posso collegare la libreria in mql4 da c++? Ecco il mio codice in Visual Studio 2012 C++. File main. con estensione 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;}

Poi ho creato un file con estensione main def (main.def) che ha un elenco di funzioni esportate, il codice sembra questo :

LIBRARY "dllmt42"
EXPORTS
add

Poi l'ho importato nel compilatore

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

Nessun problema dopo la compilazione, ma quando si lascia l'EA sul grafico, mi confondo

Chiamata di funzione di importazione non risolta, trova '_add' in 'dllmt42.dll'. Total Comander vede la funzione così come il compilatore stesso quando trascina il file

Chi può aiutare?

 
Alexandr Sokolov:

Corretto... Ma ne è rimasto uno per qualche motivo.

E non posso riprodurlo nel tester. Non ho questo errore nella stessa data

Questo errore mostra che stai cercando di modificare una posizione/ordine al prezzo al quale hai fatto la modifica in precedenza...

 

Sto cercando di recuperare i dati dell'indicatore in MT5 utilizzando una funzione:

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

Ricevo un errore:


Si prega di consigliare come correggere il codice per MT5

 
Vladimir Pastushak:

Questo errore indica che stai cercando di modificare una posizione/ordine al prezzo al quale l'hai già modificata...

No, l'ho già controllato molte volte, il problema era nella casualità della selezione dei parametri di input di MQL quando si testano i prodotti, che non sono sempre compatibili - ho risolto anche questo. Ma ora ho ricevuto un messaggio che non c'è nessun ordine aperto


Anche se li ho sulle stesse coppie e timeframes

 
Alexandr Sokolov:

No, l'ho già controllato molte volte. Il problema era nella casualità della selezione dei parametri di input di MQL quando si testano i prodotti, che non sono sempre compatibili - ho già risolto anche questo. Ma ora ho ricevuto un messaggio che non c'è nessun ordine aperto


Ma li ho sulle stesse coppie e sugli stessi timeframe

Non so perché il mio EA non fa trading.

 
Vladimir Pastushak:

Scopri perché l'EA non fa trading.

Potrebbe non fare trading se i parametri di input sono scelti casualmente in modo che i segnali semplicemente non si verificano. Ma non bisogna nemmeno limitarlo

 

Cosa si intende per"distanza di congelamento commerciale"? Ricevuto attraverso

SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL)

MQL4

 

Ho di nuovo l'errore #1 quando modifico. In questo EA, i livelli SL o TP sono modificati solo in quattro blocchi


1 blocco

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 blocco

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 blocco

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 blocco

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


Ho già controllato tutto molte volte ma non riesco a trovare nessun errore

 
Alexandr Sokolov:

Ho di nuovo l'errore #1 quando modifico. In questo EA, i livelli SL o TP sono modificati solo in quattro blocchi



OrderStopLoss() != NormalizeDouble(0,_Digits)


Questo non è corretto, anche in altri esempi

Se metti uno stop a 1.2356 e su un nuovo tick metti di nuovo uno stop a 1.2356, otterrai l'errore 1