[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 502

 
edit | delete Aiuto per trovare una funzione per piazzare ordini che tenga conto dello slippage e senza errori 130-134.
 
nuan:
edit | delete Aiuto per trovare una funzione per piazzare ordini che tenga conto dello slippage e senza errori 130-134.

Mostrami la tua variante.
 
NumderOrder=OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-SL*Point,Ask+TP*Point, "BUY",0,0,Red);

Print(GetLastError());

Con qualsiasi valore di SL e TP dà 134, spesso non piazza affatto un ordine.

si apre su condizione if(NumberOfOrders(NULL)==0)


Nel tester, invece di un ordine ne piazza sempre un mucchio, cioè non riesco a capire perché dovrebbe piazzare un ordine se non ci sono altri ordini aperti su questa coppia

 
scusa, perché c'è più di un ordine
 
nuan:
NumderOrder=OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-SL*Point,Ask+TP*Point, "BUY",0,0,Red);

Print(GetLastError());

Con qualsiasi valore di SL e TP dà 134, spesso non piazza affatto un ordine.

si apre su condizione if(NumberOfOrders(NULL)==0)


Nel tester, invece di un ordine ne piazza sempre un mucchio, cioè non riesco a capire perché dovrebbe piazzare un ordine se non ci sono altri ordini aperti su questa coppia


ERR_NOT_ENOUGH_MONEY 134 Non ci sono abbastanza soldi per completare la transazione
 

Buona giornata. Sto facendo un EA, apre 2 ordini in una certa condizione (in senso figurato: quando il prezzo sale e scende). Quando il prezzo sale, ne apre 2, quando il prezzo scende, chiude quei 2 e ne apre altri 2. Un ordine va senza take profit, il secondo ordine con un take profit. C'è un problema con la seconda. Al momento in cui arriva la sua ora di morte, non è selezionato, ecco il codice per rimuovere gli ordini:

for (int a = 0; a < OrdersTotal()-1; a++)
    if (OrderSelect(a, SELECT_BY_POS, MODE_TRADES))
        if (OrderComment() == "MyOrd" && OrderType() == OP_SELL)
            OrderClose(OrderTicket(), NormalizeDouble(OrderLots(), Digits), NormalizeDouble(Ask, Digits), 0);

Lo stesso per OP_BUY. Sto confrontando i commenti per sapere con certezza che si tratta di un ordine aperto dal mio EA e non manualmente o da un altro EA. Ecco il problema con OrderSelect, semplicemente non vuole selezionare un ordine con un take profit. Quando arriva a un suo numero, OrderSelect restituisce false. Non c'è nessun errore nel log del tester, anche GetLastError dice che tutto è a posto (restituisce 0). Perché non viene selezionato? Perché nessun errore se non poteva selezionarlo? Grazie a tutti.

 
Domanda di follow-up. Perché nel tester, quando imposto il periodo a mese+, nei risultati appaiono cinque cifre? Ovunque siano impostati i prezzi, metto NormalizeDouble(SomeValue, Digits). E solo nei risultati, il registro non impreca, anche se quando non sapevo della funzione di arrotondamento, allora imprecava.
 

la condizione

a < OrdersTotal()-1

viene controllato ad ogni iterazione.

Pensate a cosa equivale a e a cosa equivale OrdersTotal() -1 dopo la prima iterazione

 
Solree:

OrderClose(OrderTicket(), NormalizeDouble(OrderLots(), Digits), NormalizeDouble(Ask, Digits), 0);

Il lotto e il prezzo hanno cifre diverse.
 

Solree:

NormalizeDouble(OrderLots(), Digits)


Inoltre - non è così facile normalizzare il lotto.
È necessario prendere in considerazione il passo ammissibile del cambio di lotto.
Per esempio, se il passo è 0,01, allora normalizzare per 2
e se il passo è 0,1, allora la normalizzazione dovrebbe essere 1