Problema con il codice EA 2 (gestore SL) - pagina 4

 
diostar:

È probabile che questo possa offrire un po' di assistenza, spero.

Inizialmente, i miei simboli erano a 4 cifre, tutti i trailing stop, gli ordini stop/limit modificati, sono andati proprio come previsto. Poi il mio broker ha deciso di andare frazionario. Ho fatto le modifiche necessarie e ho visto i miei pip andare come -3,4, -4,5, 0,1, 4,6, 7,3, ecc, ecc. Pensavo che questo andasse bene, ma in realtà no: Supponiamo che io imposti il mio limite=7, e diciamo che i nuovi tick 1,tick 2,tick 3 avvengono in sequenza:

1) 7.3>limite, poi l'ordine viene modificato... il broker riempie 1 slippage off...

2) 7.5>limite, poi l'ordine viene modificato....broker riempie 0 slippage...

3) 7.1>limite, poi l'ordine viene modificato...il broker riempie 2 slippage off...

Quindi, tutto sommato, i miei ordini vengono modificati 3 volte per tutti e 3 i tick. avendo realizzato questo, ho deciso di usare MathRound() per arrotondare gli ordini al numero intero più vicino, quindi 1,2,3 diventa

1) mathround(7.3) =7 >limite, NON VERO, non modificato

2) mathround(7.5)=8 >limite, VERO, l'ordine è modificato

3) mathround(7.1)=7>limite, NON VERO, non modificato

In realtà sto ancora lavorando su come migliorare quanto sopra... finora stanno funzionando bene, ma penso che ci debbano essere modi migliori dei miei.


Fantastico Diostar, questa è un'informazione molto molto utile per me in realtà, specialmente quella parte che ho evidenziato.

Quindi se risolvo il mio problema, il meglio che posso sperare è:

ogni volta che le mie condizioni sono soddisfatte al gap 00, 01, 02 ecc, il meglio che posso sperare è 1,2,3 (rispettivamente) scroll thoughs di ogni hey. Quindi al gap 03 modificherà il mio ordine 02,01,00, poi 01,00,02 poi 00,02,01 fino a quando tutti gli ordini sono modificati? Se li faccio scorrere in avanti la stessa cosa, ma ordine diverso ecc.

Penso che potrei essere a posto se questo accade in realtà... tuttavia potrei trovare lo stesso come te più tardi e voglio stringere di più, ma sono felice di affrontare un ponte alla volta... Grazie per la previsione però!

Sto ancora per provare quella forumula...

 
anche quella formula è andata bene, grazie per il supporto lì Diostar, mi stavo rincorrendo la coda per secoli per imparare il codice, grazie.
 

Come sempre il modo hey, con il senno di poi pensare ad una soluzione diversa.....

Solo per il mio apprendimento, il blocco qui sotto avrebbe funzionato come un work-around alternativo al mio problema prima?


//---------------------------old attempt where it spammed modifies--------------------------------------
//---------------------------I got around this problem another way before-------------------------------
void ModifySellBlock()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
        {
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

//--------------------------any problems with this block?----------------------------------------------
 
 
//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];<-----then, arrayinitialize
    
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);<-----if(orderselect...

        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)<----orders >0
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)<---if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET)

        {
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;      
         
            can consider if(SL>0 || TP>0){
          
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}
 
diostar:


Grazie per il tuo tempo con questo Diostar. All'epoca, non avevo le conoscenze necessarie per avere questa idea. Anche ora l'ho rimodellata da alcuni pezzi di codice, dato che sto ancora imparando a fare gli ARRAY...

Onestamente non posso credere quanto sia stato difficile fare una sezione di codice, che semplicemente seleziona tutti gli ordini, e li modifica una volta sola... se il flusso di dati è stato inviato qui ogni volta...

Apprezzo il tuo tempo con le tue aggiunte, le proverò... Ehi anche Diostar, credo di aver notato anche io quello che hai detto prima, grazie per l'anticipazione così so che non è stato il mio codice.... Vedo scorrere le modifiche (* #ordini che ho in corso), e noto uno slittamento in arrivo... vi terrò informati se lo aggiro, possibilmente con il codice di cui sopra come inizio per essere onesti, grazie ancora ;)

 
Funky:


Grazie per il tuo tempo con questo Diostar. All'epoca, non avevo le conoscenze necessarie per avere questa idea. Anche ora l'ho rimodellata da alcuni pezzi di codice, dato che sto ancora imparando a fare gli ARRAY...

Onestamente non posso credere quanto sia stato difficile fare una sezione di codice, che semplicemente seleziona tutti gli ordini, e li modifica una volta sola... se il flusso di dati è stato inviato qui OGNI TICK...

Apprezzo il tuo tempo con le tue aggiunte, le proverò... Ehi anche Diostar, credo di aver notato anche io quello che hai detto prima, grazie per l'anticipazione così so che non è stato il mio codice.... Vedo lo scorrimento delle modifiche (* #ordini che ho in corso), e noto uno slittamento in arrivo... vi terrò informati se lo aggiro, possibilmente con il codice di cui sopra come inizio per essere onesti, grazie ancora ;)

Non c'è di che. Lo slippage, proprio come lo spread, fa fuori-quota il risultato in qualsiasi modifica di prezzo, sl, tp. Ma ho sempre ordersend() con slippage zero, ancora. Può essere buono per avere 1,2 punti, ma finora, così bene.