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

 
Funky:

Ciao Raptor, grazie ancora.

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

2. Va bene come ho usato la funzione OrderSelect?

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

3. È questo il caso? In caso affermativo, il codice seguente risolverebbe il problema?

Grazie ancora ;)

1. È solo qualcosa che mi è saltato all'occhio che romperà il tuo codice.


2. Il tuo OrderSelect è sbagliato ( https://docs.mql4.com/trading/OrderSelect ) se hai intenzione di selezionare usando il numero del biglietto devi usare SELECT_BY_TICKET non SELECT_BY_POS

3. Non credo, quello che hai fatto, penso, significherà solo che quella funzione viene chiamata solo una volta... cosa succede quando hai il prossimo ordine da modificare? Cosa succede se hai due ordini aperti allo stesso tempo?

Non sono esperto al 100% di quello che stai facendo, non ho il tempo di guardare il tuo codice abbastanza in dettaglio per farlo... ma ho una domanda.

Non puoi guardare l'OrderOpenPrice(), l'OrderStopLoss() e l'OrderTakeProfit() di un ordine e determinare se è già stato modificato al livello 1 2 o 3 ?

 
RaptorUK:

1. È solo qualcosa che mi è saltato all'occhio che romperà il vostro codice.


2. Il tuo OrderSelect è sbagliato ( https://docs.mql4.com/trading/OrderSelect ) se vuoi selezionare usando il numero del biglietto devi usare SELECT_BY_TICKET non SELECT_BY_POS

3. Non credo, quello che hai fatto, penso, significherà solo che quella funzione viene chiamata solo una volta... cosa succede quando hai il prossimo ordine da modificare? Cosa succede se hai due ordini aperti allo stesso tempo?

Non sono esperto al 100% di quello che stai facendo, non ho il tempo di guardare il tuo codice abbastanza in dettaglio per farlo... ma ho una domanda.

Non puoi guardare l'OrderOpenPrice(), l'OrderStopLoss() e l'OrderTakeProfit() di un ordine e determinare se è già stato modificato al livello 1 2 o 3 ?

Grazie Raptor, la tua visione mi è stata molto utile...

Capisco perfettamente anche i limiti di tempo, il tuo tempo e i tuoi consigli sono stati molto apprezzati.... Non stavo cercando di chiedere a qualcuno di scriverlo per me, quindi non sono andato molto nel dettaglio... il che presenta il problema che senza molti dettagli è difficile offrire aiuto, quindi mi scuso..... In questo caso, era più il codice che mi preoccupava mentre imparavo e i vostri consigli sono stati grandiosi per me

1. Mi sono dato da fare per metterlo insieme e testarlo, quindi potrei risolvere il problema dell'alimentazione più tardi, quando sarò più esperto.

2. Passerò a SELECT_BY_TICKET, piuttosto che POS, grazie mille.

3. Voglio che il GAP_Level1 sia chiamato solo una volta, quindi forse ho ragione nel modo in cui ho messo tutto insieme.... Per rispondere alla tua domanda, sto cercando di guardare l'ultimo ticket dell'ordine in sospeso, per vedere se supera il mio marchio TradeUp. Quando ciò accade, vorrei che trascinasse in alto tutti i miei ordini precedenti (questa volta selezionando per numero magico per averli tutti)... A questo punto, ho un altro ordine pendente aperto, e quando arriva a Gap_Level2, avrò un blocco BuyModify_Level2, con lo stesso codice.... Plausibile?

Spero di scrivere con la mia logica, mi sono davvero seduto con la carta come mi hai suggerito questa volta per tirare fuori le palle... ;)

 
Funky:


3. Voglio che il GAP_Level1 sia chiamato solo una volta, quindi forse ho ragione nel modo in cui ho messo tutto insieme.... Per rispondere alla tua domanda, sto cercando di guardare l'ultimo ticket dell'ordine in sospeso, per vedere se supera il mio marchio TradeUp. Quando ciò accade, vorrei che trascinasse in alto tutti i miei ordini precedenti (questa volta selezionando per numero magico per averli tutti)... A questo punto, ho un altro ordine pendente aperto, e quando arriva a Gap_Level2, avrò un blocco BuyModify_Level2, con lo stesso codice.... Plausibile?


Come (o dove nel tuo codice) imposterai HasBeenExecuted = false ; in modo che IfGap_Level_1() venga eseguito per il 2° set di trade ?
 
RaptorUK:
Come (o dove nel tuo codice) imposterai HasBeenExecuted = false ; in modo che IfGap_Level_1() venga eseguito per il 2° set di trade ?

Buona domanda, amico.

Avevo intenzione di bootare questa variabile all'inizio delle variabili interne sotto quelle che esporto. Avevo intenzione di fare un GAP_Level_1, GAP_Level_2, GAP_Level_3, GAP_Level_4, GAP_Level_5 ecc. Quindi, una volta raggiunto il GAP_Level_1, può dimenticare questo primo livello di gap.

Il tuo punto mi ha fatto pensare, molto apprezzato. Ora vedo un problema.

Mi sono reso conto che quando un trade colpisce uno SL e ricomincia da capo, voglio che il primo trade cerchi nuovamente Gap_Level_1 e ruoti attraverso. E dannazione sì, questo causerà un problema, dato che stavo per legare PendingOrder_1 con GAP_Level_1, PendingOrderLevel_Level_2 con GAP_Level2.

Credo di poterlo ancora fare, ma non ci avrei mai pensato se non avessi menzionato.....

Mi vengono in mente tre soluzioni... Il primo si adatta alla mia potenza cerebrale un po' meglio haha ;)

1. se vado in IF LAST TRADE IS LOSS, allora CANCELLO TUTTI GLI ORDINI IN ATTESA, e li riavvio se un trade colpisce uno SL. Così che l'ordine pendente 1 va a Gap Level_1, fermerà Pending_Order5 essendo il prossimo trade aperto che va a GAP_Level5. Dopo che uno SL viene colpito, tutti i miei trade aperti saranno chiusi poiché condividono lo stesso SL, quindi chiudere i miei Ordini Pendenti e riavviare la logica potrebbe essere ok.

2. L'altra opzione che mi viene in mente (grazie al tuo suggerimento con l'altro mio problema di codice qualche settimana fa), è di inserire una variabile booleana dopo che il primo trade è stato fatto chiamata NEWTRADE, e poi avere un blocco IFNEWTRADE==1, poi andare a GAP_Level1. Questo mi fa pensare che potrei fare IFNEWTRADE1 nel blocco Pending Order 1, e IFNEWTRADE2 nel blocco Pending Order 2 e così via... poi IFNEWTRADE2==1 va a GAP_Level2.

EDIT (dopo un caffè): 3. Ho appena pensato, cosa succederebbe se ordinassi gli ordini in base al tempo (ora so che si possono ordinare più ordini in molti modi), e assegnassi una variabile intermedia chiamata ORD_SELECT_NUMBER basata sul TEMPO. Poi dopo ORD_SELECT_NUMBER == 1, andare a GAP_Level1, poi guardare il prossimo ORD_SELECT_NUMBER usando quel comando ORDER_SELECT_NUMBER ++.

Sono bravo a scrivere EA a ordine singolo basati su segnali ecc, è solo questa roba dell'ordine multiplo che onestamente mi uccide... Il mio EA funziona così com'è, e ottiene buoni risultati, è solo pazzesco da usare, in quanto modifica su OGNI TICK, e usa solo il mio più piccolo Gap_Level atm ovviamente, dato che sto lavorando su come legare tutto insieme sopra...

Wow, ma grazie ancora Raptor, oltre alla CONOSCENZA DI CODIFICA vedo quanto sia importante anche una buona LOGICA, grazie per avermi fatto riflettere.

 
Funky:

Wow, ma grazie ancora Raptor, oltre alla CONOSCENZA DI CODIFICA vedo quanto sia importante anche una buona LOGICA, grazie per avermi fatto riflettere.

Hai capito male... tutto il software, non importa in quale linguaggio sia codificato, C++, Perl, Pascal, Fortran, Assembler, ecc. Se la logica dietro la tua soluzione è difettosa, allora non importa quanto tu sia bravo a codificare... la soluzione viene prima, il codice viene dopo.
 
RaptorUK:
Hai capito male... tutto il software, non importa in quale lingua sia codificato, C++, Perl, Pascal, Fortran, Assembler, ecc. Se la logica dietro la tua soluzione è difettosa, allora non importa quanto tu sia bravo a codificare... la soluzione viene prima, il codice viene dopo.

Capisco quello che dici... Un costruttore senza piani di costruzione, non andrà lontano, anche se è il miglior costruttore del mondo. Il piano iniziale è quasi più importante, ti capisco.

Sei stato un grande aiuto per me Raptor, e volevo dire ancora grazie.

Sono andato con l'opzione 1 pigro sopra.

Sono state ore e ore di programmazione, il mio EA è circa 85k (quindi solo postato un frammento), quindi devo ancora riferire come sono andato dopo che questo dinosauro è completo. Sto avendo un po' di fortuna, gli ordini vengono selezionati correttamente. Sto studiando man mano che vado, dato che è lontano dagli EA a ordine singolo che sono abituato a scrivere. Mi sono buttato nel profondo con questo progetto e sto imparando a nuotare. Vi posterò di nuovo come vado.

Grazie ancora Raptor :)

 
Funky:

Capisco quello che dici... Un costruttore senza piani di costruzione, non andrà lontano, anche se è il miglior costruttore del mondo. Il piano iniziale è quasi più importante, ti capisco.

Sei stato un grande aiuto per me Raptor, e volevo dire ancora grazie.

Sono andato con l'opzione 1 pigro sopra.

Sono state ore e ore di programmazione, il mio EA è circa 85k (quindi solo postato un frammento), quindi devo ancora riferire come sono andato dopo che questo dinosauro è completo. Sto avendo un po' di fortuna, gli ordini vengono selezionati correttamente. Sto studiando man mano che vado, dato che è lontano dagli EA a ordine singolo che sono abituato a scrivere. Mi sono buttato nel profondo con questo progetto e sto imparando a nuotare. Vi posterò di nuovo come vado.

Grazie ancora Raptor :)

Una volta che ti vedi espandere le tue risorse di codice, e ci sono funzioni che possono essere rese comuni per qualsiasi uso futuro dell'EA, considera di usare library/include, ecc.

Bec. una volta che cresce in tirannosauro, i tuoi codici si perdono nel loro proprio parco giurassico, specialmente quando ne hai bisogno di nuovo per qualsiasi uso futuro.

 
diostar:

Una volta che vi vedete espandere le vostre risorse di codice, e ci sono funzioni che possono essere rese comuni per qualsiasi uso futuro di EA, considerate di usare librerie/include, ecc.

Bec. una volta che cresce in tirannosauro, i tuoi codici si perdono nel loro proprio parco giurassico, specialmente quando ne hai bisogno di nuovo per qualsiasi uso futuro.



Haha amico, che mi ha dato una risata. Capisco come questo possa accadere.

Ad essere onesti ho trovato una libreria inserita chiamata 'OrderSendReliable.mqh'. Ho intenzione di finire questo EA prima, poi stavo per postare di nuovo come sono andato con quel Library Insert con quell'altro post EAcode che avevo in corso, perché credo che potrebbe risolvere la cosa del mercato caldo.

Ho avuto una risata, perché ora posso vedere, come con l'esperienza, ci sarebbero tutti i tipi di #include nella parte superiore della EA, haha, e si porta in giro una cache 1mb di file per ogni EA.

Sai che il tuo commento mi fa pensare, è appena andato click. Ho semplicemente tagliato e incollato del codice tra i miei EA quando ho trovato una {sezione} che mi piace, e li ho legati (ad esempio quella {sezione} con cui stavo avendo problemi in quell'altro post che ho menzionato prima). Non avevo nemmeno pensato di farlo come una Library Insert, e fare semplicemente riferimento ad essa... Sono molto lontano da questo tipo di cose... Stavo giusto per iniziare la mia prima libreria include dopo questo EA con quello per vedere come funzionano.... le possibilità sono così cool. E 'abbastanza coinvolgente questo MQL.

Oh sì, tutto va bene anche con il mio codice, funziona perfettamente per il suo scopo, stavo tornando per dare un grande grazie :) ..

Apprezzo molto il vostro supporto ragazzi, vorrei poter descrivere quanto a parole ;)

 

Puoi avere i tuoi set di funzioni di libreria "core", che ti consiglio vivamente di considerare prima, piuttosto che dopo.

Anche io ho iniziato con il mio primo EA, stessa cosa, copia, incolla, copia incolla....

Il punto di svolta è stato quando stavo facendo questo EA per il mio vecchio servizio militare ex-co, già in pensione. Questo ha cambiato tutto, ho iniziato ad usare la libreria per la prima volta.

Conservo ancora quella libreria fino ad oggi. Se può offrirti delle idee, aiutandoti ad andare avanti... ecco la sua intestazione, amico:

#define PI              3.1415629
#define GOLDEN_RATIO    1.618

#import "command.ex4"
   bool     isInit();
   bool     isFractional(string ins);
   bool     isOrderLimit(int cap);
   bool     isRiskLimit(double risk);
   
   int      ioSession(int h);
   string   ioWkday(datetime d);
   double   ioOrderPriceLvl(string ins, int type, double oPrice);    
   double   ioPriceLvl(string ins,double dPrice);
   bool     ioTrailStop(string ins, int tkt, int type, double oPrice,int lvl, double stop=0);
   int      ioTotalOrd(int magic);
         
   int      opClose(string ins,int ticket,int cmd,double lLot,bool Activate.NO_BREAK_ONE=false);
   int      opOpen(string ins, int cmd, double lLot, double lPrice, double lLoss, double lProfit, string comment,int EA.Id, int lSlip=0, bool Activate.NO_BREAK_ONE=false);
   int      opModify(string ins, int ticket,int cmd,double lPrice,double lLoss,double lProfit,bool Activate.NO_BREAK_ONE=false);   
   double   opStopLvl(string ins,double p);
   double   opNorm(string ins,double price);
   double   opNormL(string ins,double d);   
   double   opPoint(string ins);
   
   double   intelLot(string market, double risk,double stop); 
   double   intelCorrel(string s1,string s2, int f, int type);   
   int      intelPriceMove(string ins, int p, int L);
   int      intelTrend(string ins, int p, int q);   
#import

spero che questo aiuti....

 
diostar:

Potete avere i vostri set di funzioni di libreria "core", che vi consiglio vivamente di considerare prima, piuttosto che dopo.

Ho anche iniziato con il mio primo EA, stessa cosa, copia, incolla, copia incolla....

Il punto di svolta è stato quando stavo facendo questo EA per il mio vecchio servizio militare ex-co, già in pensione. Questo ha cambiato tutto, ho iniziato a usare la libreria per la prima volta.

Conservo ancora oggi quella libreria. Se può offrirti delle idee, aiutandoti ad andare avanti... ecco la sua intestazione, amico:

Spero che questo aiuti....


Ciao Diostar, questo è davvero forte amico, grazie per aver condiviso questa informazione, dovevo ancora leggere sulle librerie. Sembra un modo fantastico per portare in giro le variabili e averle predefinite per dopo. Ci penserò. Mi piace come hai detto "prima piuttosto che dopo", mi piacciono consigli del genere, grazie amico. Mi ricorda come imparare a suonare la chitarra, quando 20 anni dopo penso che vorrei aver fatto 'così e così' dall'inizio, avrebbe reso gli ultimi 20 anni più facili, lol. Guarderò seriamente in questo più, grazie.

Ah, proprio quando pensavo di essere in fiamme, ho un dramma, che non riesco a pensare di risolvere. Sto avendo problemi con la selezione degli ordini corretti in queste due sezioni di unione:

Potrei mostrare due dei miei esempi, e mostrare gli effetti, il mio cervello non vuole proprio andare a cliccare su questo...

Esempio 1:

SCORRIMENTO attraverso gli ordini precedenti esattamente come voglio io, tuttavia li modifica su OGNI CLICK

(il dramma originale con ordine selezionare Raptor mi ha aiutato con fermato i livelli di conflitto, così il SL slopping intorno per quella ragione prima troppo. Mi sembrava che quest'ultima parte fosse facile da risolvere, ma ci sono stato sopra per giorni, cercando di impedire che accadesse ogni volta).

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)))
            {
                IfGap_SELLLevel_00AlreadyExe = false;
            }
            if (IfGap_SELLLevel_00AlreadyExe == false)
            {
                IfGap_SELLLevel_00AlreadyExe = true;
                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) 
        { 
            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()));
        }
    }
    
}


Esempio 2:

Questo esempio non è quello che voglio... Ho provato questa opzione per evitare che modifichi l'invio ad ogni tick... tuttavia non fa scorrere gli ordini, e modifica solo uno dei ticket corretti ad ogni tick (modifica il primo ordine, credo l'ultimo nella cache degli ordini di Index).

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()
{
    bool IfGap_SELLLevel_00AlreadyExe = FALSE;
    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;
            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()));
        }
    }
    
}


Ho altri 50 tentativi, provando prima una piccola sezione IF EXECUTED 00 per passarlo a IFGAP se non eseguito prima... tuttavia non ho avuto molta fortuna inserendo uno switch prima di hand..... Potrei semplicemente postare questo esempio per mostrare questa opzione....

Esempio 3:

Con uno swtich... ha ancora lo stesso effetto dell'esempio 1. Scorre correttamente gli ordini ma modifica ancora ad ogni ticck...

Posso vedere che l'interruttore continua a ottenere problemi un falso di nuovo, quindi corre solo attraverso di nuovo ... tuttavia altri tentativi non lo lascerebbe passare attraverso a tutti ... dovrei attaccare con questa opzione e provare a dichiarare IfGap_SELLLevel_00AlreadyExe = true altrove, se sì dove?

void IfGap_SELLLevel_00AlreadyBlock()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES))
    {
        IfGap_SELLLevel_00AlreadyExe = false;
    }
    if (IfGap_SELLLevel_00AlreadyExe == false)
    {
        IfGap_SELLLevel_00AlreadyExe = true;
        IfGap_SELLLevel_00();  
    }
}


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) 
        { 
            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 ret = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Quindi sì, ci ho provato davvero ragazzi prima di disturbarvi ancora.... per ore e ore... Sono di nuovo perso...

Qualsiasi aiuto o suggerimento sarebbe apprezzato ;)