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

 

Questo link qui è 'molto' al di sopra di me in questa fase, tuttavia posso vedere come potrei fare un bel file di libreria per affrontare i miei problemi... https://www. mql5.com/en/articles/1390. Sono un po 'nervoso a costruire array di biglietti atm e spero di poterlo aggirare per ora... poiché quando modifico, è solo tutto ciò che Pair e Magic ecc.

Ho fatto tutto correttamente prima di arrivare alla sezione Modifica. Seleziona correttamente per biglietto, e poi passa al blocco Modifica... quella parte è ottima.

Ma non riesco a capire se le cose si bloccano in questa sezione di modifica o se sono nei guai perché "deve passare attraverso queste sezioni per prendere l'ordine successivo".

Speravo di poterlo mandare al blocco di modifica e fargli modificare tutti gli ordini di quel Magic Number e Symbol. Ecco perché ho provato un piccolo interruttore vero o falso.

Se ha bisogno di passare attraverso queste sezioni ogni tick 'per selezionare il prossimo ordine', potrei essere nei guai.

Forse potrei semplicemente nominare manualmente i biglietti che devono essere modificati, ma non credo che questo sia il problema, dato che li ottiene correttamente, solo che ciclicamente ogni tick, e io sono un noob per sapere perché...

Questa potrebbe essere un'altra opzione?

 for(int i=1; i<=OrdersTotal(); i++)
     { 
      if (OrderSelect(i-1,SELECT_BY_POS)
       executedpreviously = true;
       while(true)
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

Un continue;, return(), o break; sarebbe utile da qualche parte?

 

Ah, ho visto un errore in uno dei miei esempi precedenti...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

Penso che dovrebbe essere:

bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


    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 && IfGap_SELLLevel_00AlreadyExe == FALSE)
        { 
            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);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

Questo dovrebbe isolarlo in quella sezione... sono le 5 del mattino quindi ancora da testare... (perso un'ora, maledetta ora legale haha)

Se lo faccio passare in questa sezione in un modo, spamma le modifiche degli ordini su ogni tick con l'ultimo ordine... e se lo faccio passare nell'altro modo, fa scorrere gli ordini correttamente, ma modifica ancora la cache degli ordini su ogni tick...

Posso far scorrere gli ordini all'indietro 5,4,3,2,1 o in avanti 1,2,3,4,5, ma non riesco a pensare a un modo per farlo passare per modificare tutti gli ordini senza spammarli.

Mi chiedo 1) devo farlo passare una volta per modificare tutti gli ordini che passano..., o 2) deve passare ogni volta che deve selezionare un nuovo ordine?

Sto ancora imparando, tutto qui. Se nessuno può indirizzarmi nella giusta direzione, proverò questa linea qui sopra, con una pausa e la fine e vedrò se questo finisce.... deve essere qualcosa di semplice...

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

NON hai fatto alcun errore. Il primo è BUONO per andare...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) <--- this is GOOD to go..


Potrei aver avuto un prb abbastanza simile prima, se ho letto bene tutto questo. Stavo cercando di creare il mio "modificare gli ordini stop/limit per il livello minimo MODE_STOP, se Bid/Ask si allontana di x Pip...".

Il tuo caso è simile?

 
diostar:

NON hai fatto alcun errore. Il primo è BUONO per andare...


Potrei aver avuto un prb abbastanza simile prima, se ho letto bene tutto questo. Stavo cercando di creare il mio "modificare gli ordini stop/limitare il livello minimo MODE_STOP, se Bid/Ask si allontana di x Pip...".

Il tuo caso è simile?



Grazie Diostar, sto cercando di fare una specie di cumulo con gli ordini in sospeso, poi, quando arriva al prossimo ordine in sospeso con esito positivo, fa apparire i vecchi stop.

Proverò di nuovo con il !... così tante combinazioni da provare... e vedo, avrei dovuto usare "false" per il valore booleano invece di FALSE... sì, ha compilato e funziona ancora bene, ma stesso problema. Potrei trovare di nuovo quella bozza e provare con "false"... In quell'esempio 2, non scorreva attraverso gli ordini, e modificava ogni tick, quindi proverò di nuovo con questa variabile cambiata.

Riesco a farlo passare al blocco di modifica e a far ruotare gli ordini in avanti o indietro, ma modifica ogni tick, e se inserisco un filtro vero o falso dopo la modifica, modifica solo il primo ordine nella cache....

per me questo suggerisce che l'EA ha bisogno di arrivare a questo blocco ogni tick per ottenere l'ordine successivo (non ero sicuro se quando arriva a questo blocco, se posso semplicemente sigillarlo qui, e farlo ruotare attraverso gli ordini una volta)...

questo mi presenta un problema, poiché qualsiasi domanda vera o falsa non lo lascia passare...

Penso che se imparassi a fare una cache degli ordini e a selezionarli, avrei ancora lo stesso problema... Ho avuto tutte le combinazioni, ma non tutte allo stesso tempo. L'ho fatto modificare una volta e poi andare avanti, ma ha ottenuto solo il primo ordine e si è fermato... quindi mi sto chiedendo se dovrei usare quello con un interruttore con ogni orderticket effettivamente specificato... Non ero sicuro che il mio bool OrderTicket() per segnalare il mio messaggio di errore, avesse incasinato anche la dichiarazione di un Pending_OrderTicket_XX... Deve essere qualcosa di semplice...

come avete risolto questo problema nel vostro?

 
void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    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 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            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;
            OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


Indipendentemente da come dichiaro nelle variabili globali...

bool IfGap_SELLLevel_00AlreadyExe;

..sembra modificare una volta, MA solo uno degli ordini, presumo l'ultimo ordine con il modo in cui scorro gli ordini.

Ho tolto il ret00 prima del biglietto d'ordine nel caso in cui anche...

Almeno non è ogni tick, potrei usare questo esempio SE continuasse a scorrere i miei ordini quando le condizioni per la prima forumula sono vere (ma non su ogni tick 'spamming modifica' dopo lo scorrimento ok, come fa il mio tentativo più riuscito...)

Anche questo tentativo non ha funzionato:

**sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_TICKET))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
            if (Stoploss_Level_05 == 0) Level_05_SL = 0;
            double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
            if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
            OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

Mostro più chiaramente quello che sto cercando di fare comunque, vorrei che questo sopra funzionasse, sarei stato fatto se così fosse...

Spero comunque di essere sulla strada giusta... Ancora non capisco perché il mio esempio 1 prima era sbagliato, la cosa stupida fa esattamente quello che voglio, ma ogni tick... Non riesco nemmeno a farlo funzionare quando programmo gli ordini, quindi sono di nuovo completamente perso...

Qualche suggerimento?


EDIT: Sto diventando davvero esausto, ma ho appena pensato a questo, tuttavia dovrò provare più tardi perché ho finito il tempo...

void IfGap_SELLLevel_05()
{
    if (OrderSelect(SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
            if ((Gap_Level_05 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_05*PipValue*Point))
             || (Gap_Level_05 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_05*PipValue*Point)))
            
             {
              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_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
                       if (Stoploss_Level_05 == 0) Level_05_SL = 0;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
                       if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
                       OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

hai a che fare con il punto frazionario?

 
diostar:

hai a che fare con il punto frazionario?


Penso di aver raddoppiato il valore di SL e TP se è questo che intendi, in modo che venga assegnato il prezzo per impostare lo SL e il TP. Spero di non essermi sbagliato facendo questo.

Ho solo bisogno che MT4 arrivi a quel blocco e poi se ne dimentichi.... Ho la sensazione che l'espressione sarà troppo complicata per MT4, ma continuerò a provare...

 
Funky:


Penso di aver raddoppiato il valore di SL e TP se è questo che intendi, in modo che gli venga assegnato il prezzo per impostare lo SL e il TP. Spero di non essermi sbagliato facendo questo.

Ho solo bisogno che MT4 arrivi a quel blocco e poi se ne dimentichi.... Ho la sensazione che l'espressione sarà troppo complicata per MT4, ma continuerò a provare...

No, quello che voglio dire è che si tratta di 4/5 cifre - 0.0001, o 0.00001 Punto?
 
diostar:
No quello che voglio dire è, stai trattando 4/5 cifre - 0.0001, o 0.00001 Punto?


Ah 5 cifre... Uso questo prima...

extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



E stavo pensando prima, potrei provare a trasformare questo Detect Digits come il mio primo inserto di libreria, hehe, ma un passo alla volta, devo imparare a strisciare prima, hehe.

Non sto ricevendo nessun messaggio di errore 130 prezzo da chiudere o altro.... Vorrei che fosse qualcosa di semplice come quello.

Nell'ultima pagina avevo l'esempio 1 funzionante, e un sacco di altri esempi simili, vorrei solo poterlo far modificare una volta per tick...

Invece di cercare di ottenere tutti i miei precedenti ordini SELL in una sola volta, mi chiedo se dovrei solo fare una nuova casella per ciascuno di essi... sì, sono davvero perso come fare un ciclo attraverso tutti i miei vecchi SELL in uno qualsiasi dei miei tentativi, e modificarli una volta.


&& (OrderStopLoss() < Stoploss_Level_00)

invece di

!IfGap_SELLLevel_00AlreadyExe

Sai che suggerisci qualcosa prima Diostart che mi ha fatto pensare...

Mi sto chiedendo se un'idea !IfGap_SELLLevel_00AlreadyExe non funzionerà (se non ha intenzione di afferrare tutti gli ordini e modificarli nello stesso passaggio attraverso prima di bloccare quel blocco), mi chiedo se uso la tua idea prima, e mettere una domanda come questa in là... Farò un salto indietro se funziona.

Se sono sulla strada sbagliata però per favore fatemi sapere, grazie ;)

 
Funky:


Ah 5 cifre... Uso questo prima...



E stavo pensando prima, potrei provare a trasformare questo Detect Digits come il mio primo inserimento in libreria, hehe, ma un passo alla volta, devo imparare a strisciare prima, hehe. <-- mossa saggia. Stai strisciando. Con le librerie, finirai per camminare.

Non ricevo nessun messaggio di errore 130 prezzo da chiudere o altro.... Vorrei che fosse qualcosa di semplice come questo...

Nell'ultima pagina avevo l'esempio 1 funzionante, e molti altri esempi simili, vorrei solo poterlo far modificare una volta per tick... <--- vedi sotto

Invece di cercare di ottenere tutti i miei precedenti ordini SELL in una volta sola, mi chiedo se dovrei solo fare una nuova casella per ognuno di loro... sì, sono davvero perso come fare un ciclo attraverso tutti i miei vecchi SELL in uno qualsiasi dei miei tentativi, e modificarli una volta.<--- vedi sotto


È 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.