Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 32

 
Vitalie Postolache:

Voilà, c'est différent, maintenant on sait clairement à quoi se rapporte le 1% ;)

if(Open[x] > Close[x]+Open[x]*0.01) {code}
On ne comprend pas la langue. Pour deux mots, il faut 10 lignes, puis pour 10 mots, deux seulement suffisent... On pourrait penser qu'il y a un ordre dans la programmation, puis un désordre à la fin).
 
spoiltboy:
Le Conseiller Expert prend en compte les valeurs min et max des X dernières barres et place les ordres en fonction de celles-ci. Ensuite, lorsque le maximum ou le minimum est diminué, vous devez supprimer l'ordre correspondant et l'ouvrir par de nouvelles données.


Je n'ai pas compris exactement quand vous modifiez les pauses, mais j'ai fait en sorte que si le prix minimum est supérieur au prix de réglage existant de la BuyLimit, alors vous devez le modifier au nouveau prix Min.

Pour SellLimit - en miroir.

J'ai seulement écrit le code, mais je ne l'ai pas du tout vérifié - je vous laisse le soin de modifier et de vérifier l'exactitude de l'algorithme et du code en général.

//--- input variables
input    double   LotB=0.1;      // Лот Buy
input    double   LotS=0.1;      // Лот Sell
input    int      Pointsl=100;   // StopLoss в пунктах
input    int      Pointtp=100;   // TakeProfit в пунктах
input    int      NumBars=10;    // Количество баров для поиска Max/Min
input    int      Magic=100500;  // Magic

//--- global variables
struct DataPendingOrder
  {
   int      number;     // Количество
   double   price_set;  // Цена установки
  };

struct DataPending
  {
   DataPendingOrder  buy_limit;  // BuyLimit
   DataPendingOrder  buy_stop;   // BuyStop
   DataPendingOrder  sell_limit; // SellLimit
   DataPendingOrder  sell_stop;  // SellStop
  };

struct DataOrders
  {
   int         buy;     // Количество позиций Buy
   int         sell;    // Количество позиций Sell
   DataPending order;   // Данные отложенного ордера
  };
DataOrders getData;   // Данные ордеров и позиций
double lotB, lotS;
int    pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
   pointsl=(Pointsl<0?0:Pointsl);
   pointtp=(Pointtp<0?0:Pointtp);
   double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
   lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- заполним структуру количеством ордеров и позиций
   GetNumOrders(Symbol(),Magic,getData);
  
   //--- найдём максимальную и минимальную цены за bars свечей
   double maxPrice=0.0, minPrice=DBL_MAX;
   for(int i=0; i<numBars; i++) {
      double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
      if(max_i>maxPrice) maxPrice=max_i;
      double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
      if(min_i<minPrice) minPrice=min_i;
      }

   //--- если нету рыночных Buy
   if(getData.buy==0) {
      //--- если нет отложенного BuyLimit
      if(getData.order.buy_limit.number==0) {
         double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
         double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
         ResetLastError();
         int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
         if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError());
         else Print("OP_BUYLIMIT OK");
         }
      //--- если есть BuyLimit
      else {
         //--- если цена Min больше цены установки BuyLimit
         if(minPrice>getData.order.buy_limit.price_set) {
            // модифицировать BuyLimit - поставить его на цену minPrice ...
            //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }
  
   //--- если нету рыночных Sell
   if(getData.sell==0) {
      //--- если нет отложенного SellLimit
      if(getData.order.sell_limit.number==0) {
         double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
         double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
         ResetLastError();
         int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
         if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError());
         else Print("OP_SELLLIMIT OK");
         }
      //--- если есть SellLimit
      else {
         //--- если цена Max меньше цены установки SellLimit
         if(maxPrice<getData.order.sell_limit.price_set) {
            // модифицировать SellLimit - поставить его на цену maxPrice ...
            //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }

   //---
   string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
   Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
  }
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров   |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataOrders &data_of) {
   ZeroMemory(data_of);
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic_number) continue;
         if(OrderSymbol()!=symbol_name)       continue;
         //--- рыночные позиции
         if(OrderType()==OP_BUY)    data_of.buy++;
         if(OrderType()==OP_SELL)   data_of.sell++;
         //--- отложенные ордера
         if(OrderType()==OP_BUYLIMIT)  {  data_of.order.buy_limit.number++;   data_of.order.buy_limit.price_set=OrderOpenPrice();   }
         if(OrderType()==OP_BUYSTOP)   {  data_of.order.buy_stop.number++;    data_of.order.buy_stop.price_set=OrderOpenPrice();    }
         if(OrderType()==OP_SELLLIMIT) {  data_of.order.sell_limit.number++;  data_of.order.sell_limit.price_set=OrderOpenPrice();  }
         if(OrderType()==OP_SELLSTOP)  {  data_of.order.sell_stop.number++;   data_of.order.sell_stop.price_set=OrderOpenPrice();   }
         }
      }
}
//+------------------------------------------------------------------+

J'espère que vous trouverez la solution

 
Artyom Trishkin:

Pourquoi supprimer quand on peut modifier le prix de fixation et le stop et le takeout par rapport au nouveau niveau ?

Je viens de commencer mes études et l'option de suppression consistait à étudier l'application de la fonction, je me suis demandé pourquoi cela ne fonctionnait pas.

Merci à tous pour vos commentaires.

 

Quelqu'un veut savoir à quoi doit ressembler la commande de réinitialisation externe ?

à quoi cela devrait ressembler

1) Sélectionnez dans la liste un ensemble de conditions requises pour le déclenchement de la commande, par exemple l'ouverture d'un ordre.

2) L'ordre est ouvert et la commande ne fonctionne pas dans d'autres conditions. Le filtrage par ticket et par quantité de commande n'est pas une option puisque le principe lui-même doit être réparti dans toute la liste.

 
si (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) Quelle est l'erreur ici si GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] utilise l'intersection mobile + filtre sur la distance après l'intersection mobile. Quelle est la précision de cette condition ?
 
Movlat Baghiyev:
si (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) Quelle est l'erreur ici si GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] utilise l'intersection mobile + filtre par distance après l'intersection mobile. Quelle est la précision de cette condition ?

Ce queGrossMA1 etGrossMA2 vous renvoient, il y a très probablement une différence, vous obtenez quelque chose comme ceci

MA1= 1,0050

if (MA1 > 0.0052) // ce n'est pas le prix lui-même mais sa différence, donc ce n'est pas une comparaison incorrecte

 
Vitaly Muzichenko:

Ce queGrossMA1 etGrossMA2 vous retournent, il y a probablement une différence là, vous vous retrouvez avec quelque chose comme ceci

MA1= 1,0050

if (MA1 > 0.0052) // ce n'est pas le prix lui-même, mais sa différence, donc c'est une comparaison incorrecte

Pouvez-vous me dire comment procéder correctement ?
 
Vitaly Muzichenko:

Ce queGrossMA1 etGrossMA2 vous renvoient, il y a très probablement une différence ici, vous obtenez quelque chose comme ceci

MA1= 1,0050

if (MA1 > 0.0052) // ce n'est pas le prix lui-même, mais sa différence, donc c'est une comparaison incorrecte

FRMA1=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 0);
    FRMA2=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1);

    FMA1=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0);
    FMA2=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1);

    GrossMA1=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0);
    GrossMA2=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1);
 
Vitaly Muzichenko:

Ce queGrossMA1 etGrossMA2 vous renvoient, il y a très probablement une différence, vous obtenez quelque chose comme ceci

MA1= 1,0050

if (MA1 > 0.0052) // ce n'est pas le prix lui-même, mais sa différence, donc c'est une comparaison incorrecte

L'intersection est vraie. La question est plus liée à cette conditionBid>MA1+Distanse*Point()
 

Bien. Pouvez-vous me dire où se trouve l'erreur ?

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  } 

Tout fonctionne, passe une commande au prix de maxpr1.

Ensuite, je veux faire la même chose, mais au prix minpr1 :

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  }

Erreur 130 (arrêts erronés). Qu'est-ce que je fais de mal ?

Raison: