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

 
Swan >> :

errore 130 per tutto il tempo.

StopLevel dovrebbe essere controllato, per StopLoss e Enter.


e icho

deve essere scelto il più alto?


-130 probabilmente a causa di un tentativo di impostare un ordine pendente, e il prezzo è andato sopra o sotto) nel codice, ci sono linee non commentate con Marketlevel... questo è il monitoraggio del prezzo futuro, quindi non c'è questo errore)

-Più basso basso o alto di OrderOpenPrice per lo stop) Se comprare, più basso H4 basso di 0 candela e 1 candela... e il massimo storico per una vendita... Generalmente più basso/alto per l'arresto

 
ALex2008 >> :

-130 probabilmente a causa di un tentativo di impostare un ordine pendente, e il prezzo è andato più in alto o più in basso) nel codice ci sono linee non commentate con Marketlevel... questo è il monitoraggio del prezzo futuro, in modo che non ci sia questo errore).

-Basso o alto più basso di OrderOpenPrice per lo stop) Se compri, scegli il minimo H4 più basso di 0 candela e 1 candela... e il massimo storico per una vendita... In generale, il livello più basso/alto per lo stop

Per correggerlo, ora vai al minimo più alto per comprare e al massimo più basso per vendere.

o come segue

StopLoss=MathMin(b0,b1);
StopLoss=MathMax(s0,s1);
 
Swan >> :

Nada da correggere, ora per comprare si sceglie il minimo più grande, e il massimo più piccolo per vendere.

Logicamente lo è, va bene!) Questa è la scelta per la fermata (è scelta la più piccola in ppt. delle due opzioni)

Esempio:


Ma la tua versione è migliore e più semplice... Lo correggerò, ma al contrario) Grazie.

StopLoss=MathMax(b0,b1);
StopLoss=MathMin(s0,s1);

Corretto il codice a pagina 5.

 
ALex2008 >> :

Logicamente lo è, va bene!) Questa è la scelta per l'arresto (è scelta la più piccola in ppt. delle due opzioni)



taki per comprare il più piccolo)

imho meglio il più grande e il trawl sulla prima barra, logica diversa :)


StopLevel.

si può cambiare Invio

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)
      {
      DellAllOrders();
      Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      if( Enter-Ask< StopLevel) Enter=Ask+ StopLevel;
      OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);
      }
   }

o aprire un ordine

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)
      {
      DellAllOrders();
      Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      if( Enter-Ask< StopLevel)
      OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, 0, Ask+ Profit, 0, 0,0, Green);
      else 
      OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);
      }
   }

o pensare a qualcos'altro)

 
Swan писал(а) >>

taki per comprare il più piccolo)

imho meglio comprare con la più alta e trainare sulla prima barra, logica diversa :)

Con StopLevel.

è possibile cambiare Enter

o aprire un ordine

o si può inventare qualcos'altro).

Il prezzo aperto dovrebbe essere più lontano da StopLevel da Bid o Ask. Dal prezzo aperto prendi le posizioni Take e Stop che non dovrebbero essere più vicine dello StopLevel. Ma per loro possiamo usare il blocco di chiusura per profitto o drawdown.

 
Swan >> :

...imho meglio il più grande e il trawl del primo bar, logica diversa :)

L'ho fatto anche in questo modo... ma il risultato del test è migliore allo stop attuale)

 

Corretto lo stopplay...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
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)){
         DellAllOrders();
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(Ask<= Enter- StopLevel){
         RefreshRates();
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
      }
  }
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)){
         DellAllOrders();
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(Bid>= Enter+ StopLevel){
         RefreshRates();
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
      }
  }

   
//-------Вычисление стопа и утановка
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){
            StopLoss=MathMax( b0, b1);//Функция возвращает максимальное из двух числовых значений
            if(Bid- StopLoss< StopLevel) StopLoss=MathMin( b0, b1); 
            else OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel) StopLoss=MathMax( s0, s1);
            else OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
   }


Swan >> :

...o aprire subito un ordine.

(È molto più sicuro entrare con ordini pendenti) Altrimenti, la vostra società di intermediazione o nofarms vi aprirà molto lontano...))

>> ha modificato il codice.

 
ALex2008 >> :

Corretto lo stopgap...


(È meglio usare gli ordini pendenti) Altrimenti, il DC mostrerà qualcosa o nofarms ti aprirà molto lontano...))

>> ha aggiustato il codice.

Risolvere vecchi bug, aggiungerne di nuovi :D


Corretto anche questo)

//+------------------------------------------------------------------+
//|                                                    CandyLite.mq4 |
//|                                                    Ш.Александр.В |
//|                                              shestovav@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Ш.Александр.В"
#property link      "shestovav@gmail.com"

#include <stdlib.mqh>

extern double Profit = 3000;

int Type, Ticket;
double Stop, StopLevel, b0, b1, s0, s1, StopLoss, Enter;
bool dwn, up, mod;

int init(){
   Profit*=Point; 
   return(0);
  }

int deinit() {
   return(0);
  }

int start() {
   StopLevel=Point*MarketInfo(Symbol(),MODE_STOPLEVEL);   // вычисление стоплевел //Point*
   
   if(! WorkOrders()){
      UpTrend();
      DownTrend();
   }
      
   if( WorkOrders()){
      if (( Type<=1)&& ( Stop==0)) SetStop();
      if (( Type==1)||( Type==5)) UpTrend();
      if (( Type==0)||( Type==4)) DownTrend();
   }

   return(0);
  }
//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
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)){
         DellAllOrders();
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(Ask< Enter- StopLevel+0.5*Point){
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
      }
  }
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)){
         DellAllOrders();
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(Bid> Enter+ StopLevel-0.5*Point){
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
      }
  }

//-------Вычисление стопа и установка
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){
            StopLoss=MathMax( b0, b1);//Функция возвращает максимальное из двух числовых значений
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point)//можно попробовать убрать строку
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            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);
         }
   }
   
//-------Удаление всех ордеров, открытых и отложенных
void DellAllOrders(){
      if( WorkOrders()){
      if( Type<=1)OrderClose( Ticket,OrderLots(),OrderClosePrice(),10);
      else OrderDelete( Ticket);}
  }
  
//-------Поиск ордеров
bool WorkOrders(){
      for (int i=OrdersTotal()-1; i>=0; i--){
      if (!OrderSelect( i, SELECT_BY_POS))  continue;
      if (OrderSymbol()!=Symbol())        continue;
      Type  = OrderType();
      Ticket=OrderTicket();
      Stop  =OrderStopLoss();
      return(true);}
  return(false);
  }
 
Swan >> :

Risolvere vecchi bug, aggiungerne di nuovi :D

per cosa?

0.5*Point

E MarketInfo() restituisce il tipo double, perché convertirlo in Point...?

Anche questo... due condizioni.


if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
if(Bid- StopLoss> StopLevel-0.5*Point)//можно попробовать убрать строку

Credo che sia tutto ciò che ho notato. È meglio spiegare per cosa è stato cambiato) Così posso tenerlo a mente per il futuro).

 
ALex2008 >> :

Non capisco...)

E MarketInfo() restituisce il tipo double, perché convertirlo in Point...?

Anche questo...


0,5*Punto è un delta, puoi convertirlo in 0,7 :)

Vedi confronto tra numeri reali.

probabilmente funzionerà correttamente senza di esso. nella maggior parte dei casi)


l'errore era

MarketInfo(Symbol(),MODE_STOPLEVEL)

restituisce un valore in pip. moltiplicato per Punto.


Era

            if(Bid- StopLoss< StopLevel) StopLoss=MathMin( b0, b1); 
            else OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

se vero a StopLoss viene assegnato un nuovo valore,

Altrimenti l'ordine viene modificato.

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