E facciamone un "cartone animato" (multicurrency) - pagina 7

 
Swan >> :

Era

Quando StopLoss è vero, viene assegnato il nuovo valore,

altrimenti l'ordine è modificato.

nessun errore, ma bisogna togliere una croce o mettere dei pantaloni).

Non l'ho capito subito))... la condizione potrebbe non causare un arresto!

Forse dovremmo rimuovere qualcos'altro? Sembra che la logica non soffra... Perché ho bisogno della seconda condizione se una sola è sufficiente?

StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

O così...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);


Cigno >> :

vedi confronto tra numeri reali.

Lo leggerò... Quindi, è assolutamente necessario? Non l'ho mai fatto).

 
ALex2008 >> :

Non l'ho capito subito... La condizione potrebbe non causare un arresto!

Non possiamo rimuovere altro? Sembra che la logica non soffra...

Forse) la candela 4h è di solito più grande dello StopLevel...


ALex2008 >> :

Lo leggerò... Cioè, è necessario? Non l'ho mai fatto in questo modo)

ogni sorta di cose strane accadono quando i valori confrontati sono quasi uguali)

quando si controlla un numero di tipo doppio per l'uguaglianza - obbligatorio.


 StopLoss-Ask< StopLevel-0.5*Point

In russo: StopLoss meno Ask è inferiore a StopLevel con precisione 0.5*Point

(StopLoss,Ask,StopLevel sono normalizzati)

 
StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
//StopLoss может присвоиться новое значение, желательно и его проверить на StopLevel
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
È un po' un casino, ma bisogna pensarci).
 

E questa opzione? Sembra ragionevole tenerlo...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Dovremmo anche controllare il contesto commerciale, altrimenti otteniamo errori che è occupato - TradeDispatcher: trade context is busy ... Si scopre che se ci sono molte copie dell'EA, tutte chiudono simultaneamente l'ordine corrente sui loro simboli e ne impostano di nuovi... si formerà un ingorgo)

probabilmente è così che funziona...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Ask< Enter- StopLevel+0.5*Point){
               OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Bid> Enter+ StopLevel-0.5*Point){
               OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }

Cioè, prima di chiudere l'ordine corrente e impostare un nuovo ordine pendente, controlliamo il flusso commerciale... Se è occupata, fa una pausa di 1 secondo.

 
ALex2008 >> :

E questa opzione? Sembra ragionevole tenerlo...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

No, è così che funziona. Dobbiamo deciderci).

tre opzioni:

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=Ask+ StopLevel;//+x*Point
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

ALex2008 ha scritto >>.

Inoltre, dobbiamo controllare il thread degli scambi, altrimenti si possono avere errori di occupazione... Perché se ci sono molti grafici, tutti chiudono gli ordini correnti allo stesso tempo...
int start() {
   if(!IsTradeAllowed()) return(0);

se non aiuta, prima di tutti gli OrderSend,OrderModify,OrderClose,OrderDelete controllate IsTradeContextBusy()


ALex2008 >>:
Solo dove posizionarlo correttamente penso... Voglio dire, per esempio, i vecchi ordini non vengono cancellati perché il thread è occupato, ma il programma deve piazzarne di nuovi... E il programma deve piazzarne di nuovi solo quando tutti i vecchi ordini sono stati cancellati.

riscrivere più facilmente. nelle funzioni UpTrend() e DownTrend() controllare le condizioni, gli ordini vengono rimossi e messi,

troppe cose diverse)

 
Swan >> :

No, è così che funziona. >> devi decidere tu).

Non capisco, lo farà o non lo farà?)

 
ALex2008 >> :

Non capisco - funzionerà o no?))

*non succederà.

Nella tua ultima variante.

         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

nel primo if() StopLoss non è definito.

 
Swan >> :

*non succederà.

Nella tua ultima variante.

nel primo if() StopLoss non è definito.


Allora, che cos'è?

nel primo se, lo stop prende il minimo (al prezzo) basso di 2 candele... cioè lontano dall'ordine

StopLoss=MathMin(b0,b1); 

nel secondo se lo stop riceve il massimo (al prezzo) minimo di 2 candele. cioè è vicino all'ordine


StopLoss=MathMax(b0,b1);
 
ALex2008 >> :
         if( Type==0){
//здесь StopLoss нипанятно какой)
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
 

//здесь StopLoss нипанятно какой)

Cosa non è chiaro esattamente? È zero quando si entra nella funzione. Forse non capisco qualcosa....


Sopra c'è una condizione - Se l'ordine è aperto e il suo stop = 0, allora metti uno stop

if ((Type<=1)&&(Stop==0))SetStop();

e la funzione stessa per impostare uno stop


//-------Вычисление стопа и установка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
   }