Any questions from newcomers on MQL4 and MQL5, help and discussion on algorithms and codes - page 32

 
Vitalie Postolache:

There you go, that's different, now it's clear what the 1% is in relation to ;)

if(Open[x] > Close[x]+Open[x]*0.01) {code}
You can't understand the language. You need 10 lines to write two words, then you need only two to write 10 words... You'd think programming would be fine and then it would be a mess in the end.)
 
spoiltboy:
The Expert Advisor considers min and max values of the last X bars and places orders by them. Then, when maximum or minimum is decreased, you should delete the corresponding order and open by new data.


Didn't understand exactly when you modify the pauses, but made it so that if the minimum price is higher than the existing BuyLimit setting price, then you need to modify it to the new Min price.

For SellLimit - mirrored.

I have only written the code, but haven't checked it at all - I leave it to you to modify and check the correctness of the algorithm and the code in general.

//--- 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();   }
         }
      }
}
//+------------------------------------------------------------------+

I hope you will figure it out

 
Artyom Trishkin:

Why delete when you can modify the setting price and stop and takeout relative to the new level?

I've just started studying and the deletion option was to study the application of the function, I wondered why it didn't work.

Thank you all for your feedback.

 

Anybody want to know what the extern reset command should look like?

how it should look like

1) Select a set of required conditions from the list for the command to trigger, e.g., open an order

2) The order is opened and the command does not work under any other conditions. The filtering by ticket and order quantity is not an option since the principle itself should be spread throughout the list.

 
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) What is the error here if GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] use moving intersection + filter on distance after moving intersection. How accurate is this condition?
 
Movlat Baghiyev:
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) What is the error here if GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] use moving intersection + filter by distance after moving intersection. How accurate is this condition?

WhatGrossMA1 andGrossMA2 return you, there is probably a difference there, you end up with something like this

MA1= 1.0050

if (MA1 > 0.0052) // it is not the price itself but its difference, so it is not an incorrect comparison

 
Vitaly Muzichenko:

WhatGrossMA1 andGrossMA2 return you, there is most likely a difference there, you end up with something like this

MA1= 1.0050

if (MA1 > 0.0052) // that is, not the price itself, but its difference, so it is an incorrect comparison

Can you tell me how to do this correctly?
 
Vitaly Muzichenko:

WhatGrossMA1 andGrossMA2 return you, there is most likely a difference there, you end up with something like this

MA1= 1.0050

if (MA1 > 0.0052) // that is, not the price itself, but its difference, so it is an incorrect comparison

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:

WhatGrossMA1 andGrossMA2 return you, there is probably a difference there, you end up with something like this

MA1= 1.0050

if (MA1 > 0.0052) // that is, not the price itself, but its difference, so it is an incorrect comparison

The intersection is correct .The question is more related to this conditionBid>MA1+Distanse*Point()
 

Good. Can you tell me where the error is?

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");
  } 

Everything works, places an order at the price of maxpr1.

Then I want to do the same, but at minpr1 price:

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");
  }

Error 130 (wrong stops). What am I doing wrong?

Reason: