Problema con il codice EA 2 (gestore SL)

 

Ciao,

Grazie ancora per il tuo aiuto mentre sto imparando MQL.

Ecco il mio prossimo problema.... Sono MOLTO vicino a questo .... Sto facendo tutto quello che voglio... Tuttavia sta modificando gli SL su OGNI TICK se il GAP è superiore a questo criterio, invece di eseguire solo una volta...

Si tratta di un codice molto semplice, e di un problema molto semplice che non riesco a risolvere in questa fase, e qualsiasi aiuto mi aiuterebbe a imparare...

Questo è solo il LATO ACQUISTO atm, tuttavia ho scritto i permessi per l'IFGAP per il lato OP_SELL per dopo.


La funzione di questo EA è di:

1. iniziare un trade di acquisto se uno non esiste.

2. al livello di TP 1, spostare SL in alto.... al livello di TP 2, spostare SL in alto ancora.... al livello di TP 3, spostare SL in alto ancora una volta l'ultima volta. Bello e semplice davvero...


Il problema del noob che sto avendo è:

1. Esegue il mio OrderModify EVERYTICK se sopra GAP... Non riesco a pensare come cambiare la logica, ma una volta che mi viene mostrato, lo saprò per il futuro...


Grazie in anticipo.

Cordiali saluti e felici pips a tutti.


int start()
{
    if (Bars < 10)
    {
        Comment("Not enough bars");
        return (0);
    }
    if (Terminated == true)
    {
        Comment("EA Terminated.");
        return (0);
    }
    
    OnEveryTick();
    
}

void OnEveryTick()
{
    if (DetectBrokerDigits == false && FiveDigitBroker) PipValue = 10;
    if (DetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;
    
    IfGap_Level_1();
    IfGap_Level_2();
    IfGap_Level_3();
    IfBUYOrderDoesNotExist();
    
}

void IfGap_Level_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_2 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_2*PipValue*Point))) ||
            ((Gap_Level_2 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_2*PipValue*Point)))))
            {
                BuyOrderModifyLevel_2();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_2*PipValue*Point, price + BuyTakeprofit_Level_2*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_3 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_3*PipValue*Point))) ||
            ((Gap_Level_3 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_3*PipValue*Point)))))
            {
                BuyOrderModifyLevel_3();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_3*PipValue*Point, price + BuyTakeprofit_Level_3*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfBUYOrderDoesNotExist()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == InitialOrderType && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists == false)
    {
        Initial_BuyOrder();
        
    }
}

void Initial_BuyOrder()
{
    double SL = Ask - InitialBuyStoploss*PipValue*Point;
    if (BuyStoploss_Level_3 == 0) SL = 0;
    double TP = Ask + Initial_Takeprofit*PipValue*Point;
    if (Initial_Takeprofit == 0) TP = 0;
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, 0, 0, "My Expert", BUY_Magic, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, SL, TP, "My Expert", BUY_Magic, 0, Blue);
    if (ticket > -1)
    {
        if (true)
        {
            OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}



int deinit()
{
    if (ClearAllObjects) ObjectsDeleteAll();
    
    
}

 
Funky:

Il problema del noob che sto avendo è:

1. Esegue il mio OrderModify EVERYTICK se sopra GAP... Non riesco a pensare come cambiare la logica, ma una volta che mi sarà mostrato, lo saprò per il futuro...

Se non vuoi eseguirlo per ogni tick, quando vuoi eseguirlo? Intendi ogni tick ma solo una volta? Per farlo basta controllare se lo SL e il TP sono già stati regolati.

Un altro commento. . . IfGap_Level_1() passa in rassegna tutti gli ordini aperti alla ricerca di quelli che corrispondono a Symbol e Magic number, poi controlla se l'ordine è in profitto per un certo importo, ecc . . . se lo è chiama BuyOrderModifyLevel_1(), questa funzione passa in rassegna tutti gli ordini aperti alla ricerca di quelli che corrispondono a Symbol e Magic number ed è un Buy . . vedi una piccola ripetizione qui? perché non passi semplicemente il Ticket number da IfGap_Level_1() a BuyOrderModifyLevel_1()?

 
Funky:

Ciao,

Grazie ancora per il tuo aiuto mentre sto imparando MQL.

Ecco il mio prossimo problema.... Sono MOLTO vicino a questo .... Sto facendo tutto quello che voglio... Tuttavia sta modificando gli SL su OGNI TICK se il GAP è superiore a questo criterio, invece di eseguire solo una volta...

Si tratta di un codice molto semplice, e di un problema molto semplice che non riesco a risolvere in questa fase, e qualsiasi aiuto mi aiuterebbe a imparare...

Questo è solo il LATO ACQUISTO atm, tuttavia ho scritto i permessi per l'IFGAP per il lato OP_SELL per dopo.


La funzione di questo EA è di:

1. iniziare un trade di acquisto se uno non esiste.

2. al livello di TP 1, spostare SL in alto.... al livello di TP 2, spostare SL in alto ancora.... al livello di TP 3, spostare SL in alto ancora una volta. Bello e semplice davvero...


Il problema del noob che sto avendo è:

1. Esegue il mio OrderModify EVERYTICK se sopra GAP... Non riesco a pensare come cambiare la logica, ma una volta che mi viene mostrato, saprò per il futuro...


Grazie in anticipo.

Cordiali saluti e felice pips tutti.


Non sei un NOOB. A giudicare dall'elegante capacità di essere in grado di scrivere e poi chiamare funzioni, nel modo in cui hai fatto. Dovresti essere in grado di vedere da solo, che le tue chiamate di funzione (profondità di logica, ecc.) possono essere semplificate forse a 1-2 funzioni.

Invece di:

OrderOpenPrice() 

nella tua condizione:

if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||

hai considerato/provato ad usare OrderStopLoss()?

 
RaptorUK:

Se non vuoi eseguirlo per ogni tick, quando vuoi eseguirlo? Intendi ogni tick ma solo una volta? Per farlo basta controllare se lo SL e il TP sono già stati regolati.

Un altro commento. . . IfGap_Level_1() passa in rassegna tutti gli ordini aperti alla ricerca di quelli che corrispondono a Symbol e Magic number, poi controlla se l'ordine è in profitto per un certo importo, ecc . . . se lo è chiama BuyOrderModifyLevel_1(), questa funzione passa in rassegna tutti gli ordini aperti alla ricerca di quelli che corrispondono a Symbol e Magic number ed è un Buy . . vedi una piccola ripetizione qui? perché non passi semplicemente il Ticket number da IfGap_Level_1() a BuyOrderModifyLevel_1()?

Ciao di nuovo Raptor, grazie ancora per il tuo tempo. Dal modo in cui l'ho detto, sembra davvero confuso. Sto avendo problemi ad unire correttamente tutti questi componenti, credo. Al momento il problema principale che sto avendo è 'sta modificando gli ordini ad ogni tick', tuttavia ora posso vedere anche altri problemi dopo i tuoi commenti. Con l'ultima parte di ciò che hai detto, se ti capisco, intendi inserire il codice BuyOrderModify all'interno di IfGap_Level_1 all'interno di un {} dopo aver controllato se il Gap è stato raggiunto piuttosto che nel proprio {}? Come in questo esempio qui sotto?


void OverGap1_soModify()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
               {
                double price = Ask;
                if (UseAskLineorNot == false)
                {
                 price = OrderOpenPrice();
                 }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

E sapete, mi sto sentendo come dejavue con il mio altro EA in un certo senso ora che la scatola sta prendendo forma (qui https://forum.mql4.com/42870 - somiglianza non intenzionale, in quanto si tratta di un EA diverso con uno scopo diverso, tuttavia questo sta indicando le stesse aree che devo imparare come includere due funzioni insieme, prometto che non stavo cercando di riempire il forum di ridondanza)...

Posso quindi chiedere in via del tutto eccezionale se una variabile IFNEWORDEREXIST = TRUE nello stesso punto risolverebbe un altro problema. Vedete, voglio che l'ultimo trade aperto che è stato fatto in ModeTrades sia quello che sto confrontando con l'IfGap_Level_X in ogni momento (credo che questa parte sia simile alla mia).


Una volta che risolvo l'errore con OrderModify che avviene su OGNITICK mentre è bloccato all'interno di quel {} se la casella sopra non è corretta, e mi occupo del problema dell'ultimo ordine selezionato, mi troverò di fronte al prossimo dramma che mentre IfGap_Level_3 è soddisfatto, lo è anche IfGap_Level_2, e IfGap_Level_1.

In un certo senso voglio che l'EA agisca come un gestore di SL, e (nonostante il singolo ordine di acquisto iniziale) ho intenzione di usarlo per gestire più operazioni. Il primo acquisto era solo per poter fare il backtest. Vorrei che questo codice:

Se Order's Pips arriva a IfGap_Level_1, voglio che vada a BuyOrderModifyLevel_1, quindi modificare gli ordini esistenti, e dimenticare questa parte del codice.

Se i Pips dell'ordine arrivano a IfGap_Level_2, voglio che vada a BuyOrderModifyLevel_2, quindi modificare gli ordini esistenti, e dimenticare questa parte del codice

Se Pips dell'ordine arriva a IfGap_Level_3, voglio che vada a BuyOrderModifyLevel_3, quindi modificare gli ordini esistenti, e dimenticare questa parte del codice

Spero di non essere troppo lontano, mi sembrava semplice all'inizio.

Speravo di poter semplicemente inserire un "break;" o qualcosa alla fine di ogni blocco e farla franca con questo codice...
diostar:

Non sei un NOOB. A giudicare dall'elegante capacità di essere in grado di scrivere e poi chiamare funzioni, come hai fatto tu. Dovresti essere in grado di vedere da solo che le tue chiamate di funzione (profondità della logica, ecc.) possono essere semplificate forse a 1-2 funzioni.

Invece di:

nella tua condizione:

hai considerato/provato ad usare OrderStopLoss()?

Ah grazie diostar, sei troppo gentile con i tuoi commenti. Sono bravo a scrivere script di base, tuttavia non sono lontano da quel livello, e ora unire il tutto mi fa venire il mal di testa. Grazie per l'incoraggiamento però, le forumule e le cose hanno tutte senso per me, non tanto la grammatica/sintassi del programma.

Credo che tu possa avere ragione su quello che dici, condensando il codice a 1-2 funzioni, sono solo incerto su come...

Se avessi l'esperienza, avrei l'IFGAP e il MODIFY ORDER in un unico blocco come penso che sia tu che Raptor stiate suggerendo, tuttavia stavo giocando sul sicuro in questa fase... Immagino che se fossi un professionista, avrei i TP su un array o uno switch, e impostare old TP=oldTP+TPincrement_Level, e potrei avere tutto in un blocco in circa 10 righe di codice... Alla fine lo farò nell'ultimo If Gap & ModifyOrder {} in modo che l'incremento SL sia incrementato a intervalli programmabili, tuttavia i primi voglio lasciarli da impostare manualmente a seconda delle condizioni di mercato...

Non ho considerato l'uso di OrderStopLoss() nella formula. Immagino che siccome varierò un po' gli SL per i primi movimenti, lo voglio basato sull'OrderOpenPrice e sui pip che è aumentato da quando è stato aperto. Non avevo spiegato molto bene l'EA, mi scuso. Grazie anche a te per il tuo tempo, molto apprezzato.

 
Funky:

Ciao di nuovo Raptor, grazie ancora per il tuo tempo. Dal modo in cui l'ho detto, sembra davvero confuso. Sto avendo problemi ad unire correttamente tutti questi componenti, credo. Al momento il problema principale che sto avendo è 'sta modificando gli ordini ad ogni tick', tuttavia ora posso vedere anche altri problemi dopo i tuoi commenti. Con l'ultima parte di ciò che hai detto, se ti capisco, intendi inserire il codice BuyOrderModify all'interno di IfGap_Level_1 all'interno di un {} dopo aver controllato se il Gap è stato raggiunto piuttosto che nel proprio {}? Come in questo esempio qui sotto?

Potresti farlo, ma non è proprio quello che intendevo...

Date un'occhiata a questo per vedere se ha senso . . .

          (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }
.
.
.


void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}

L'altra cosa che ho menzionato riguardava il controllo se l'ordine era già stato modificato cercando di vedere quali erano il suo SL e TP, in altre parole, se hai già modificato l'ordine nell'ultimo tick non farlo di nuovo in questo tick ... è questo che stavi cercando di fare?

 
RaptorUK:

Potresti farlo, ma non è proprio quello che intendevo...

Dai un'occhiata a questo per vedere se ha senso...

L'altra cosa che ho menzionato era di controllare se l'ordine era già stato modificato guardando per vedere quali erano il suo SL e TP, in altre parole, se hai già modificato l'ordine nell'ultimo tick non farlo di nuovo in questo tick . .. è questo che stavi cercando di fare?


Questo è ottimo per il mio apprendimento... Non avevo capito che si poteva mettere (OrderTicket()) dopo il nome di una funzione, bene. Quindi questo attribuisce il numero di biglietto del mio ultimo ordine aperto, figo. Questo è un suggerimento molto molto utile per le cose di cui mi occupo, grazie.

(OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }

E qui vedo che hai creato la variabile Ticket. In realtà non sapevo che si potesse dichiarare una variabile in questa parte del codice. Si può fare perché è stato dato un valore nell'ultima parte sopra? Capisco come potrebbe funzionare, allora, usa il numero di Order Ticket di quest'ultimo Trade qui invece del mio 'aspecifico' OrderTicket(). Ha senso. Sarà molto più preciso di OrderSelect(i++.. etc per me.

void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}


Qui è quasi l'una di notte quindi domani darò un'occhiata più da vicino, grazie mille per il tuo tempo.... Ho la sensazione che potrei dover inserire questa logica nel blocco "If_Gap_Levels{}" invece che nel blocco "BuyModify{}". Non mi ero spiegato troppo chiaramente, mi scuso. Penso che questo suggerimento mi aiuterà a controllare l'ultimo ticket per il GAP, e poi MODIFICARE TUTTI gli ordini precedenti con quel OP_BUY e BUY_Magic ecc.

L'altra cosa che ho menzionato era di controllare se l'ordine era già stato modificato guardando quali erano il suo SL e TP, in altre parole, se hai già modificato l'ordine nell'ultimo tick non farlo di nuovo in questo tick . .. è questo che stavi cercando di fare?

Sì, questo è esattamente dove sono bloccato in realtà... Solo che non sono sicuro di come specificarlo... Faccio un valore bool di NeedsModifying = false, e poi lo converto in True quando il criterio IfGap è soddisfatto? Posso pensare alla logica, solo non alla sintassi, tuttavia ho imparato dai tuoi consigli per me nel mio ultimo EA per essere anche in grado di suggerire la mia ultima frase. Grazie ancora Raptor.

 
Funky:

Questo è ottimo per il mio apprendimento... Non avevo capito che si poteva mettere (OrderTicket()) dopo il nome di una funzione, forte. Quindi questo attribuisce il mio Ticket che soddisfa il criterio Gap a quella funzione BuyOrderModifyLevel_1? Questo è un suggerimento molto molto utile per le cose che sono in atm, grazie.

E qui vedo che hai creato la variabile Ticket. In realtà non sapevo che si potesse dichiarare una variabile in questa parte del codice. Si può fare perché è stato dato un valore nell'ultima parte sopra? Capisco come potrebbe funzionare, allora, usa il numero di Order Ticket di quest'ultimo Trade qui invece del mio 'aspecifico' OrderTicket(). Ha senso. Sarà molto più preciso di OrderSelect(i++.. etc per me.

Fa parte della definizione della funzione . . . proprio come qualsiasi altra funzione standard, ad esempio OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify è una funzione e le si passano delle variabili, un minimo di 5 variabili, la sesta è opzionale. si può fare esattamente lo stesso con le proprie funzioni . . .

Siete i benvenuti. Notte.

 
RaptorUK:

Fa parte della definizione della funzione . . . proprio come qualsiasi altra funzione standard, ad esempio OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify è una funzione e le si passano delle variabili, un minimo di 5 variabili, la sesta è opzionale. si può fare esattamente lo stesso con le proprie funzioni . . .

Siete i benvenuti. Notte.


Grazie Raptor.... ah mi hai beccato mentre stavo modificando l'ultima frase in quel post, perché sì, avevi ragione con quello che stavo cercando...

Grazie per avermi ricordato di nuovo quel .doc... è divertente che ho letto quel particolare .doc su OrderMofidy così tante volte... Mi sembrava cinese quel manuale, tuttavia, man mano che progredisco, spiccano consigli più avanzati. Lo rileggerò ora, e scommetto che sarà chiaro come la luce del giorno quella caratteristica che hai menzionato per me, comunque grazie per avermelo fatto notare così ho saputo di cercarlo.

--copiato da sopra, dato che avevo editato l'ultima parte inconsapevolmente mentre stavi scrivendo....

L'altra cosa che ho menzionato riguardava il controllo se l'ordine era già stato modificato cercando di vedere quali erano il suo SL & TP, in altre parole, se hai già modificato l'ordine nell'ultimo tick non farlo di nuovo in questo tick . .. è questo che stavi cercando di fare?

Sì, questo è esattamente dove sono bloccato in realtà ... Non sono sicuro di come specificare questo... Faccio un valore bool di NeedsModifying = false, e poi lo converto in True quando il criterio IfGap è soddisfatto? Posso pensare alla logica, solo non alla sintassi, tuttavia ho imparato dai tuoi consigli per me nel mio ultimo EA per essere anche in grado di suggerire la mia ultima frase. Grazie ancora Raptor.

Buonanotte da Downunder.

 
RaptorUK:

Fa parte della definizione della funzione . . . proprio come qualsiasi altra funzione standard, ad esempio OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify è una funzione e le si passano delle variabili, un minimo di 5 variabili, la sesta è opzionale. si può fare esattamente lo stesso con le proprie funzioni . . .

Siete i benvenuti. Notte.


Ciao Raptor,

Mi sono spinto un po' oltre usando le idee che mi hai mostrato. Ho capito che il tuo codice avrebbe risolto il mio problema, ma poi una volta che gli ordini raggiungono il mio secondo livello di TP, sarà difficile da gestire...

Non avevo capito che potevo lasciar perdere l'OrderSelect i++ e scegliere solo il mio Ticket in quell'equazione, così ho provato questo come se risolvesse tutti i miei problemi con i trade multipli... funzionerebbe?

Se qualcuno può confermare per me che questo codice funzionerebbe, ne sarei felice... grazie ancora per il supporto ;)

void BuyPendingOrder_1()
{
    int expire = TimeCurrent() + 60 * 0;
    double price = NormalizeDouble(Ask, NDigits) + PriceOffset_1*PipValue*Point;
    double SL = price - BuyStoploss_1*PipValue*Point;
    if (BuyStoploss_1 == 0) SL = 0;
    double TP = price + BuyTakeprofit_1*PipValue*Point;
    if (BuyTakeprofit_1 == 0) TP = 0;
    if (0 == 0) expire = 0;
    int PendingOrderTicket_1 = OrderSend(Symbol(), OP_BUYSTOP, BuyLots_1, price, 4, SL, TP, "EA_Pending_Order1", BUY_Magic, expire, Blue);
     ///--^^^----^^^ allocate this ticket number to PendingOrderTicket_1 above
    if (PendingOrderTicket_1 == -1)
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    
}

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1; ///--<<<----if PendingOrderTicket_1 is over Gap_Level_1, then proceed to BuyOrderMoidfyLevel_1 section etc
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1() 
{
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)  ///--<<<----select all trades of that pair and magic
    {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             ///--^^^^^^---- modify all trades of that pair and magic if it made it this far
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            
    }
    
}
 

C'è un problema nel fare quello che stai suggerendo...

Immagina che il tuo EA sia in esecuzione . . . . poi il tuo MT4 viene interrotto per qualsiasi motivo, mancanza di corrente, crash di MT4, il PC ha bisogno di un riavvio, ecc . . . il tuo codice non può riprendere da dove ha lasciato perché non ha più il valore corretto per PendingOrderTicket_1

 
RaptorUK:

C'è un problema nel fare quello che stai suggerendo...

Immagina che il tuo EA sia in esecuzione . . . . poi il tuo MT4 viene interrotto per qualsiasi motivo, mancanza di corrente, crash di MT4, il PC ha bisogno di un riavvio, ecc . . . il tuo codice non può riprendere da dove ha lasciato perché non ha più il valore corretto per PendingOrderTicket_1


Ciao Raptor, grazie ancora.

È questo l'unico problema del codice di cui sopra? Penso che nel caso peggiore il PendingOrderTicket_1 non verrebbe modificato e si chiuderebbe al suo SL.

Va bene come ho usato la funzione OrderSelect?

 if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1

Il grosso problema che penso di avere, è che quando OrderTicket_1 è sopra il primo Gap_Level1, modificherà ancora l'ordine OGNI volta che questo criterio è soddisfatto.

È questo il caso? Se sì, il codice qui sotto risolverebbe il problema?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void BuyOrderModifyLevel_1()
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
      {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             HasBeenExecuted = false;
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            {
            HasBeenExecuted = true;
            }
     }    
   
}


O dovrei farlo con il CheckGapLevel_1, in modo che controlli solo una volta? E se è così, l'ho fatto correttamente sotto???? C'è un posto dove dovrei mettere una "pausa"?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            HasBeenExecuted = false;
            {
            HasBeenExecuted = true;                
            BuyOrderModifyLevel_1;
               
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

Grazie ancora ;)

Motivazione: