Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 63

 

Gumko:

Gumko : E quanto tempo ci vorrà perché questo compito si presenti per primo...?

È in piedi da due giorni ormai.

Ho aspettato 8-10 giorni, poi mi sono arreso e l'ho spento.
 
Mi sto chiedendo quanto carico di CPU ha il software Tester in background?
 

Ciao a tutti.

Modifiche e problemi.

Funzione esterna:

bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit){
//---- struttura vincolante e risultati commerciali
Richiesta MqlTradeRequest;
MqlTradeResult risultato;
//---- struttura di inizializzazione della ricerca di trade MqlTradeRequest per la modifica della posizione
request.action = TRADE_ACTION_SLTP;
richiesta.simbolo = simbolo;
richiesta.sl = StopLoss;
request.tp = Takeprofit;
parola stringa = "";
StringConcatenate(parola,
"<< ============ Modifyposition(): Modifica la posizione ",
simbolo," ============ >>>");
Stampa(parola);
//---- modificare la posizione e controllare i risultati della ricerca commerciale
if(!OrderSend(request,result)|| result.deal==0)
{
Print("Modifica errore =", GetLastError();
return(false);
}
return(true);
}

Ma non funziona così.

Come fare?

Grazie :)

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций - Документация по MQL5
 
mario065: Ma non funziona così, come faccio? Grazie :)

Provate in questo modo:

MqlTradeRequest request={0};
MqlTradeResult  result ={0};
 
Yedelkin:

Prova in questo modo:

Yedelkin,

Grazie, non ha funzionato.

Ho controllato se conta correttamente l'inizio della chiamata di funzione.

Ecco come ho fatto:

double Bid = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_BID),_Digits);
double Ask = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_ASK),_Digits);
double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
double SL = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
se(Open > 0){
start_buy = Ask - Open; Print("start_buy=",start_buy);
start_sel = Open - Bid; Print("start_sel=",start_sel);
}

Sorpresa nel registro:

MR 0 Core 1 10:21:49 2012.10.01 10:12:42 affare #2 vendere 0.10 EURUSD a 1.28146 fatto (basato sull'ordine #2)
GH 0 Core 1 10:21:49 2012.10.01 01 01:12:42 operazione eseguita [#2 vendere 0,10 EURUSD a 1,28146]
NI 0 Core 1 10:21:49 2012.10.01 01 01:12:42 ordine eseguito vendere 0.10 a 1.28146 [#2 vendere 0.10 EURUSD a 1.28146 (0.00000)
OF 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_buy=0.000129999999999999635
DR 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_sel=5.000000000010552e-005
LE 0 Core 1 10:21:49 2012.10.01 01:12:43 start_buy=0.0001099999999998325
IT 0 Core 1 10:21:49 2012.10.01 01:12:43 start_sel=7.00000000000145e-005

Naturalmente mi chiedevo proprio Sela, da dove vengono i numeri?

Penso di aver scritto correttamente la funzione come mostrato:

Modifica SL e TP

Ordine di trading per la modifica dei livelli di StopLoss e/o TakeProfit. Richiede 4 campi:

  • azione
  • simbolo
  • sl
  • tp
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 
mario065: Grazie, non ha funzionato.

Quindi cosa esattamente "ha fallito"?

mario065 : ho controllato se conta correttamente per iniziare la chiamata alla funzione, ecco come ho fatto:

Inserisci il codice correttamente (Ctrl+Alt+M):

  double Bid  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_BID),_Digits);
  double Ask  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_ASK),_Digits);
  double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
  double SL   = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
  if(Open > 0)
    {
     start_buy = Ask - Open;Print("start_buy=",start_buy);
     start_sel = Open - Bid;Print("start_sel=",start_sel);
    }

Qui la normalizzazione deve essere usata in una sequenza diversa.

1. poiché i valori di tipo SymbolInfoDouble(Currency,SYMBOL_BID) provengono dal server, sono già considerati normalizzati. E non c'è bisogno di normalizzarli una seconda volta. Cioè potete semplicemente scriverli:

double Bid  = SymbolInfoDouble(Currency,SYMBOL_BID);

2. Ma dopo qualsiasi operazione aritmetica la normalizzazione non c'è più, quindi se hai bisogno di ottenere un numero normalizzato, dovresti scriverlo così:

start_buy = NormalizeDouble(Ask - Open,_Digits);

Sto ancora pensando al resto.

 
mario065: Sorpresa nel registro:

DR 0 Core 1 10:21:49 2012.10.01 01:12:43 start_sel=5.000000000010552e-005
EN 0 Core 1 10:21:49 2012.10.01 01:12:43 start_sel=7.0000000145e-005

Naturalmente, interessato solo al sel - da dove vengono questi numeri?

7.00000000000145e-005 è solo un modo di scrivere il valore di un numero reale. Credo che si chiami "scientifico". Per maggiori dettagli vedere."Guida di riferimento MQL5 / Fondamenti del linguaggio / Tipi di dati / Tipi reali (double, float)".
 
Yedelkin:
7.00000000000145e-005 è solo uno dei modi di registrare il valore di un numero reale. Credo che si chiami "scientifico". Per maggiori dettagli vedere."Guida di riferimento MQL5 / Fondamenti del linguaggio / Tipi di dati / Tipi reali (double, float)".

Yedelkin,

Grazie per aver affrontato il problema.

Ecco il codice. Le funzioni per aprire la posizione sono state scritte da Nikolay Kositsin.

File:
MTB_E.mq5  9 kb
 
Si prega di consigliare come e dove specificare nell'EA il MA appartenente alla finestra n. 2.
Per esempio, ho aggiunto una MA a MFI e voglio registrare questa MA nel mio EA. Non so dove e come farlo.

Grazie per la vostra risposta)
 
mario065: Ecco il codice. Le funzioni per aprire la posizione sono state scritte da Nikolay Kositsin. Nikolay Kositsin.

1. Direi questo: usate il codice di qualcun altro con molta attenzione. Perché il codice di qualcun altro significa anche gli errori di qualcun altro.

2. Qui(https://www.mql5.com/ru/forum/6343/page64#comment_357008) ho suggerito di provare ad azzerare correttamente le variabili prima di usarle. Ma il tuo codice non ha ancora implementato questo suggerimento. Inoltre, il vostro codice contiene costrutti del tipo seguente:

//+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit)
  {
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request;
   MqlTradeResult result;
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = ...
   request.symbol       = ...
   request.sl           = ...
   request.tp           = ...
   ...
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result) || result.deal==0)
     {
      ...
     }
   ZeroMemory(request);
   ZeroMemory(result);
   return(true);
  }

Vedete, in questo costrutto le variabili request e result sono azzerate non prima del loro utilizzo, ma dopo il loro utilizzo. Inoltre, quando queste variabili locali sono azzerate, la funzione smette di funzionare, cioè l'azzeramento stesso non ha senso. In altre parole, tale costruzione è un buon esempio di come le variabili MqlTradeRequest e MqlTradeResult non dovrebbero essere azzerate. Quindi, se siete impazienti, per favore, provate a cancellare le variabili correttamente. Se qualcosa va storto, per favore, descrivete in dettaglio cosa "non funziona".

3. La Libreria Standard ha una classe commerciale"MQL5 Reference / Standard Library / Trade Classes / CTrade". Cercate di capire come applicarlo nella pratica. Nella fase iniziale di immersione nella lingua, questa classe può essere abbastanza sufficiente. Per esempio, questa classe ha il seguente metodo:"MQL5 Reference / Standard Library / Trade Classes / 2CTrade/ PositionModify". È implementato come segue:

//+------------------------------------------------------------------+
//| Modify specified opened position                                 |
//+------------------------------------------------------------------+
bool CTrade::PositionModify(const string symbol,const double sl,const double tp)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__)) return(false);
//--- clean
   ClearStructures();
//--- setting request
   m_request.action=TRADE_ACTION_SLTP;
   m_request.symbol=symbol;
   m_request.magic =m_magic;
   m_request.sl    =sl;
   m_request.tp    =tp;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

La linea "ClearStructures();" cancella la variabile m_request prima di usarla.