Sto imparando a scrivere un consigliere... - pagina 5

 


Come usare correttamente la funzione RefreshRates()?

 int ticket;
   while(true)
     {
      ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,"комментарий эксперта",255,0,CLR_NONE);
      if( ticket<=0)
        {
         ......
         RefreshRates();
        }
      else
        {
         .....
        }
     }

Leggi anche sul forum "ERROR: code=138 - requote".

Ho "OrderSend error 138" generato nel tester diverse volte al secondo... è un requote? Se sì, come combattere con esso?)

 

Dopo aver letto 20 thread su requotes... Ho finalmente capito qual è stato il mio errore)

Ho avuto uno "pseudo" requote. Il motivo era la condizione di entrata che è stata attivata e quindi il prezzo è stato inviato a . In realtà, il prezzo reale era più basso o più alto di quello annunciato in . Ogni volta che OrderSend ha cercato di aprire un ordine, ha dato errore 138, ovviamente.

La soluzione era controllare prima di OrderSend se il prezzo reale era uguale al prezzo passato dal segnale)

RefreshRates();
      if (Bid == ( цена переданная сигналом на продажу))
         OrderSend (....); //продажа

Quello che resta da fare è il controllo degli errori per gli ordini OrderModify, perché questo potrebbe portare a brutte conseguenze - no stop!

Penso che non abbiamo bisogno di un controllo per OrderSend, lasciamo che batta il suo polso al prezzo dato dal segnale) Se arrivano le requote, non avrà importanza - avrò tempo per comprare o vendere. L'importante è che tutto funzioni come previsto)

 
ALex2008 писал(а) >>

Dopo aver letto 20 thread su requotes... Ho finalmente capito qual è stato il mio errore)

Ho avuto uno "pseudo" requote. La ragione era la condizione di entrata che è stata attivata e quindi il prezzo è stato passato a OrderSend. E in realtà, il prezzo reale era più basso o più alto di quello che avevo inserito in OrderSend. Ogni volta che OrderSend ha provato ad aprire un ordine, ha dato l'errore 138.

La soluzione era controllare prima di OrderSend il prezzo reale, se era uguale al prezzo passato dal segnale).

Resta solo da controllare gli errori per gli ordini OrderModify, perché questo può portare a brutte conseguenze - no stop!

Penso che non ci sia bisogno di controllare OrderSend, lasciare che batta il suo polso al prezzo che il segnale stabilisce) Se arrivano le requote, non avrà importanza - avrò tempo per comprare o vendere. L'importante è che tutto funzioni come previsto)

RefreshRates();
utile da fare prima di accedere a Ask Bid

Se volete controllare tutti i valori di Sell o Buy Limit prima del blocco che calcola lo stop take e il prezzo di entrata - gli ordini pendenti a lungo raggio potrebbero non essere interessati se non sono calcolati in base al prezzo corrente

 
YuraZ >> :

RefreshRates();
è utile farlo prima di accedere a Ask Bid

Non è quello che ho fatto... prima del Bid

if (Bid == (цена переданная сигналом на продажу))

prima del blocco che calcola lo stop take e il prezzo di entrata - gli ordini a lunga distanza potrebbero non essere interessati se non sono calcolati utilizzando il prezzo corrente

Spiegami... Quindi, nel mio caso, non è necessario qui, perché non conta, ma confronta? Sto leggendo bene?
 
ALex2008 писал(а) >>

Non è quello che ho fatto... prima di passare a Bid


>>Si prega di spiegare. Quindi nel mio caso non è necessario qui, perché non sta contando, sta comparando? Sto leggendo bene?

Hai fatto la cosa giusta :-)

Non è un problema lì!

È solo che il tuo blocco dove accedi ai prezzi dovrebbe essere preferibilmente in un posto

è preferibile avere questo comando prima di applicare

Ci si rivolge al Bid Ask e dopo aver calcolato tutti gli stop si deve entrare nel mercato senza molto ritardo.

---

aggiungere questo al codice

in termini semplificati

1 - Segnale ricevuto - impostare il flag per l'esecuzione.

2refresh() calcola le fermate d'asporto

3-in

4-server rifiutati

Errore di decodifica 5

6-segnale è ancora attivo - flag di esecuzione impostato?

7- vai a p 1

ed è necessario rompere questo ciclo

perché può diventare abbastanza lungo

ma dobbiamo

1-decidere sull'errore

2 - cercare di sbattere il rivenditore non tanto a lungo quanto il ciclo richiede

2.1 per esempio si potrebbe fare un conteggio di quante volte si sbatte

2.2 si può fare un quantum di tempo

2.3 DEVE tenere traccia se si ha un segnale prima di emettere i comandi per l'esecuzione!

o forse è meglio se lo cancelli!

 
YuraZ >> :

...è solo che si dovrebbe avere il blocco dove si accede ai prezzi preferibilmente in un unico posto

ed è preferibile avere questo comando prima di chiamare

si va al Bid Ask e si calcolano tutti gli stop per entrare nel mercato senza molto ritardo...

In un posto... Non capisco bene... Sto lavorando sull'indicatore da molto tempo ma non riesco a completare il ciclo).

Io ce l'ho così:

-Il prezzo per entrare è definito dalle funzioni UpTrend() e DownTrend() che controllano il segnale

-controllare (se) la parità di prezzo con il prezzo del segnale

-Il prezzo da inserire e i prezzi sono elaborati da OrderSend

-il prezzo di stop viene elaborato nella funzione ModifyPos() che segue OrderSend


1- Segnale ricevuto - flag impostato per l'esecuzione //la funzione di controllo del segnale passa la funzione di impostazione dell'ordine
2-refresh() calcola i decolli //controlla la coerenza con il prezzo - prezzo del segnale (se è ancora attivo)
3-entry //calcolo degli stacchi è statico nella funzione OrderSend, si ferma nella funzione OrderModify
4-server respinto //se l'ordine non viene piazzato e c'è un segnale, allora rientriamo al prezzo del segnale (se è ancora valido)
5-decodificare l'errore //ti serve per te, nel caso ci sia un nuovo problema
6-segnale è ancora attivo - bandiera da eseguire ? //condizione di corrispondenza del prezzo - prezzo dal segnale (se è ancora valido).
7 - vai al passo 1 //al passo 3

e dobbiamo rompere questo ciclo.
può diventare abbastanza lungo //fino a quando il prezzo==il prezzo del segnale, non credo, ma può essere frequente)
ma dobbiamo

1-determinare l'errore //Credo che ci lavorerò oggi.
2-provare a sbattere il commerciante non così a lungo come dovrebbe essere //il prezzo==il prezzo del segnale
2.1 per esempio puoi fare un contatore per quante volte devi andare lungo // devi pensarci, controlla la tua storia nel tester
2.2 si può fare in un quantum di tempo //può mancare il prezzo==il prezzo del segnale (se è ancora attivo)
2.3 Devi controllare se c'è un segnale prima di dare l'ordine di eseguire ogni serie!
potrebbe essere il momento di cancellare il segnale //la funzione di controllo del segnale passa la funzione di impostazione dell'ordine


 

Ora non capisco come implementare correttamente OrderModify? Senza di esso non posso impostare uno stop... limite DC quando si apre...

- può ottenere un errore di 130 se il prezzo cambia dopo l'apertura e si avvicina

-è possibile ottenere un errore di requote 138 e il prezzo andrà più in alto e allora lo stop non sarà impostato affatto

-è possibile ottenere un requote a 138 e il prezzo andrà più in basso, il che non è critico perché lo stop sarà impostato più tardi.

Quindi...

сигнал действует

RefreshRates
();
if (Bid == ( цена сигнала))
{
OrderSend(Symbol(), OP_SELL, Lot, ( Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
OrderModify(....);
}

Gli svantaggi di questa variante sono

-Se il prezzo si muove al di sotto del prezzo aperto, lo stop non sarà mai impostato

Se il prezzo va al di sotto del prezzo aperto, lo stop non sarà mai piazzato - cercherà sempre di modificare l'ordine. Oppure no?


o giù di lì...


сигнал действует

RefreshRates
();
if (Bid == ( цена сигнала))
OrderSend(Symbol(), OP_SELL, Lot, ( Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
OrderModify(....);

Svantaggi di questa variante

-Ci saranno molti errori se il prezzo si muove contro


 

Per ora sto considerando questa opzione sullo stop, mettetelo su fino a quando non è impostato)

void ModifyPos()
   {
        if (OrderSelect(0, SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid- Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                        if ( ModifyB == false)
                           for (int i=0; ModifyB==true; i++)
                              {
                                 SLB = SLB+ i*Point;
                                 RefreshRates();
                                 ModifyB;
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+ Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                        if ( ModifyS == false)
                           for (int j=0; ModifyS==true; j++)
                              {
                                 SLS = SLS+ j*Point;
                                 RefreshRates();
                                 ModifyS;
                              }                                                   
            }      
   }

Ma ci sono errori nelle linee con ModifyB; ModifyB;

- ';' - variabile già definita

- ';' - variabile già definita




 

Un'altra opzione, ma anche con errori (

void ModifyPos()
   {
        if (OrderSelect(0, SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid- Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                        if ( ModifyB == false)
                           for (int i=0 ;; i++)
                              {
                                 SLB = SLB+ i*Point;
                                 RefreshRates();
                                 bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                                    if ( ModifyB==true)
                                       continue; 
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+ Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                        if ( ModifyS == false)
                           for (int j=0 ;; j++)
                              {
                                 SLS = SLS+ j*Point;
                                 RefreshRates();
                                 bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                                    if ( ModifyS==true)
                                       continue; 
                              }                                                   
            }      
   }
 
ALex2008 писал(а) >>

Un'altra opzione, ma anche con errori (

ticket=OrderSend( symb, bs, lot, op, slippage,0,0, comm, magic);
      if( ticket==-1) {
Print("Не получилось открыть ордер, ошибка ",GetLastError());
      }
      if( ticket>0) {
         OrderSelect( ticket, SELECT_BY_TICKET);
         if(OrderType()==OP_BUY) {
            sl= расчет стопа;
            tp= расчет тейка;
         }
         if(OrderType()==OP_SELL) {
            sl= расчет стопа;
            tp= расчет тейка;
         }
         ... Проверка стопов на стоплевел
            if(!OrderModify( ticket, OrderOpenPrice(), sl, tp, 0, CLR_NONE)) {
               Print("Не получилось модифицировать ордер, ошибка ",GetLastError());
           }
Provate in questo modo.