Imparare e scrivere insieme in MQL5 - pagina 24

 

Cosa fa questa funzione che è chiara a tutti?

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=commento;

my_trade.magic=magico;


ResetLastError();

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal();

md=0;

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

}

else

{

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

Print("Order open error = ",GetLastError());

}

ritorno(0);

}

Nella procedura OnTick()

...

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

...

All'inizio:

doppio StopLoss=250,

TakeProfit=1400;

extern double Lots = 0.1;

Perché diavolo ci sono 220 dollari nei risultati del test?

<DATA> <SALDO> <PATRIMONIO> <LIVELLO DI MARGINE

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


Se ho torto, datemi un pugno sul naso.

Non vi lascerò vedere l'intero EA. La funzione su Buy è simile...

Chiudo la posizione con l'ordine opposto.

 

Tutto a posto. Ho urlato a squarciagola. Sto imparando la lingua. Se ho offeso qualcuno, mi scuso. Lavorerò e cercherò il problema. Probabilmente l'ho fatto da solo, ma voglio davvero imparare a fare buoni EAs usando mql5. È un sistema molto buono, ma. Finora ho problemi con esso.

Anche se ho 20 Expert Advisors su mql4 senza alcun problema.

 
Khomtchenko:
...
Sarebbe meglio dare lo storico delle transazioni per il periodo in questione, piuttosto che queste cifre sconosciute. Allora forse sarà più chiaro da dove viene la perdita.
 

Ho iniziato a studiare la sezione "Operazioni sui file" poco a poco. Sapete se ci sono dei tutorial su come lavorare con i file in MQL5?

 

Come posso cancellare correttamente tutti gli ordini con una certa modalità?

Ho due funzioni per questo, check_orders controlla gli ordini con una certa modalità, e remove_sl li elimina:

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

Il problema è che nel diario di EA appaiono queste righe:

2011.05.11 21:40:19 Trades '726238' : failed cancel order #4375237 buy 0.00 at 0.00000 [Invalid request]
Cioè ci sono richieste ridondanti al server commerciale per cancellare l'ordine la richiesta di cancellazione che è già stata inviata.

 

Credo di avere un problema con la chiusura e l'apertura delle posizioni.

In qualche modo, invece di avere una posizione per 0,1 lotti, in realtà ho diversi lotti. Apparentemente le posizioni di un simbolo si sovrappongono e il volume della posizione cresce. Questo è l'unico modo per spiegare i problemi sopra menzionati con grandi valori di stop e grandi differenze durante i test. Significa che sto analizzando la presenza di trade aperti in modo errato o sto chiudendo le tracce in modo errato.

Questa è la procedura che uso per determinare se c'è una posizione aperta da un simbolo:

int Total()

{

count=0;

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

{

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

}

return(count);

}

Naturalmente, la funzione restituisce o 0 o 1.

Uso la seguente voce per aprire gli ordini

se (Totale()<1)

{

if (# qualche controllo sugli indicatori#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406);

se (#qualche controllo sugli indicatori#) OpenSell(Lots,10, "EUR/USD (Sell)",102406);

}

Ho aperto l'acquisto e la vendita sembra:

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=commento;

my_trade.magic=magico;


ResetLastError();

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal();

md=0;

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

}

else

{

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

Print("Order open error = ",GetLastError());

}

ritorno(0);

}

Chiudo i trade nella procedura principale allo stesso modo:

se (Totale()>0) TryToClose();

TryToClose è così:

int TryToClose()
{
for (i=0; i<=PosizioniTotali(); i++)
{
se (PositionGetSymbol(i)==_Symbol)
{
se (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
if(# qualche indicatore di controllo#) OpenSell(Lots,10, "EUR/USD (Sell)",102406)
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
if(# qualche controllo dell'indicatore#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406);
}
}
ritorno(0);

}

L'indicatore controlla che se ci dovrebbe essere una posizione Buy e c'è una posizione Sell, allora facciamo un Buy.

Dove ho fatto un errore. Perché mi si allargano le posizioni.

 
Khomtchenko:

Inserisci il codice tramite il pulsante SRC

Будет читабельнее
Conoscete la differenza tra un ordine MT4 e un ordine MT5?
 

In mql4 gli ordini sono sia commerciali che pendenti.

In mql5 un ordine è un trade pendente. L'entrata nel mercato è l'apertura di una posizione. Quando l'ordine viene attivato, viene aperta una posizione. Ci può essere solo una posizione per un simbolo, e ci possono essere tutti gli ordini che vogliamo.

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

Tutti continuano ad insinuare che io sia stupido. Forse sono stupido. Bene, trova i miei errori così posso correggerli.

 
Khomtchenko:

Mi viene da pensare alla stupidità. Forse sono stupido. Bene, trova i miei errori in modo che io possa correggerli.

Non sto alludendo a nulla, sono solo passato a chiedere quale sia la ragione più frequente, non conosco il tuo livello di allenamento.

Sono qui da molto tempo, mi sono già fatto un'opinione su molte persone (ognuno è forte a modo suo), non ti conosco ancora, quindi non accennerò a nulla.


Non vedo il quadro generale della strategia. A giudicare dal modo in cui stai attraversando le posizioni, la strategia è multi-valuta.

Ma hai prescritto un solo strumento, se lo strumento è uno solo, perché scorrere ciclicamente le posizioni?

Se conoscete lo strumento, non avete bisogno di cercare tutte le posizioni per trovarle, basta usare questa funzione:

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