Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1705

 

Saludos, el script funciona como se lo pido.

//+------------------------------------------------------------------+
//|                                                       Око_15.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//#include <OOP_CLibArr_01.mqh>
struct Gass
  {
   int               mag;
   double            prof;
  };
Gass plus[]= {{0},{0}};
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class Ohistory
  {
public:
                     Ohistory(
      string        _sy = "",
      int           _op =-1,
      int           _mn =-1,
      datetime      _dt =0
   )
     {
      int k=3;
      GetProfit_His(_sy, _op, _mn, 0);
      Alert("Конструктор"," k =",k);
     }
                    ~Ohistory() { Alert("Деструктор"); }

   double              inits(Gass& us[],int _magik,datetime _zeit)
     {
      double pro=GetProfit_His(Symbol(), -1, _magik, _zeit);
      for(int i=0; i<ArraySize(us); i++)
        {
         if(us[i].mag==3)
            pro+=us[i].prof;
        }
      return(pro);
     }
private:
   
   double            GetProfit_His(string sy="", int op=-1, int mn=-1, datetime dt=0)
     {
      double p=0;
      int    i, k=OrdersHistoryTotal();

      if(sy=="")
         sy=Symbol();
      for(i=0; i<k; i++)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
              {
               if(OrderType()==OP_BUY || OrderType()==OP_SELL)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(dt<OrderCloseTime())
                       {
                        p+=OrderProfit()+OrderCommission()+OrderSwap();
                       }
                    }
                 }
              }
           }
        }
      Alert(" p =",p);
      return(p);
     }
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int si=5,
       m=3;
   ArrayResize(plus,si);
   for(int i=0; i<ArraySize(plus); i++)
      plus[i].mag=m;

   int size=ArraySize(plus);
   if(si>=3)
     {
      switch(size==0)
        {
         case 0:
            if(plus[0].mag==m)
               plus[0].prof=400;

         case 1:
            if(plus[1].mag==m)
               plus[1].prof=300;
            ;
         case 2:
            if(plus[1].mag==5)
               plus[2].prof=90;
        }
     }
   for(int i=0; i<ArraySize(plus); i++)
     {
      Print(" plus[i].prof =",plus[i].prof);
     }
   Ohistory hi;
   Alert("Мужду");

   Print(" Сколько ???',  ",hi.inits(plus,-1,D'2021.10.28'));

  }
//+------------------------------------------------------------------+

Pero si lo muevo

class Ohistory

en el archivo de inclusión, deja de ver la matriz de estructuras

struct Gass
  {
   int               mag;
   double            prof;
  };
Gass plus[]= {{0},{0}};

la línea

  double              inits(Gass& us[],int _magik,datetime _zeit)

No funciona así. No sé cómo arreglar esto.

 

¿Puedes darme una pista? Aquí hay dos funciones para calcular y mostrar la parrilla de precios de las órdenes y las órdenes mínimas y máximas. Esta última la he escrito yo mismo basándome en el análogo de la función anterior. El primero funciona como se espera pero el segundo, el precio mínimo/máximo de la orden, no quiere mostrarse en el gráfico.

Por favor, ayúdenos a encontrar el error. Por favor, ayúdenme a encontrar el error.

//+----------------------------------------------------------------------------+
//| Расчет средней цены (0)-buy (1)-sell ()-all                                |
//+----------------------------------------------------------------------------+
double GetAveragePrice(int ot=-1)
  {
   double order_lots = 0, order_price = 0, avg_price = 0;
     {
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType()==ot||ot<0)
                 {
                  order_lots += OrderLots();
                  order_price += OrderOpenPrice() * OrderLots();
                 }
              }
           }
        }
     }
   avg_price = NormalizeDouble(order_price / order_lots, Digits);

   if(ObjectFind(0,"AveragePriceLine"+IntegerToString(ot))!=0)
      ObjectCreate(0,"AveragePriceLine"+IntegerToString(ot),OBJ_HLINE, 0, 0, avg_price);
   else
      ObjectSetDouble(0,"AveragePriceLine"+IntegerToString(ot),OBJPROP_PRICE,avg_price);
   if(ot==0)
      ObjectSet("AveragePriceLine"+IntegerToString(ot),OBJPROP_COLOR, clrLime);
   if(ot==1)
      ObjectSet("AveragePriceLine"+IntegerToString(ot),OBJPROP_COLOR, clrRed);
   return(avg_price);
  }
//+----------------------------------------------------------------------------+
//| Расчет средней цены мин и макс ордеров(0)-buy (1)-sell ()-all              |
//+----------------------------------------------------------------------------+
double GetAveragePriceManMaxOrders(int ot =-1)
  {
   double avg_price_min_max_orders = 0;
     {
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType()==ot||ot<0)
                 {
                  avg_price_min_max_orders = NormalizeDouble((PriceMaxOrder()*FindLastLots() + PriceMinOrder()*GetMinLotOrder())
                                             /(FindLastLots() + GetMinLotOrder()),Digits());
                  if(ObjectFind(0,"AveragePriceLineMinMaxOrders"+IntegerToString(ot))!=0)
                     ObjectCreate(0,"AveragePriceLineMinMaxOrders"+IntegerToString(ot),OBJ_HLINE, 0, 0, avg_price_min_max_orders);
                  else
                     ObjectSetDouble(0,"AveragePriceLineMinMaxOrders"+IntegerToString(ot),OBJPROP_PRICE, avg_price_min_max_orders);
                  if(ot==0)
                     ObjectSet("AveragePriceLineMinMaxOrders"+IntegerToString(ot),OBJPROP_COLOR, clrLime);
                  ObjectSet("AveragePriceLineMinMaxOrders", OBJPROP_STYLE, STYLE_DASH);
                  if(ot==1)
                     ObjectSet("AveragePriceLineMinMaxOrders"+IntegerToString(ot),OBJPROP_COLOR, clrRed);
                  ObjectSet("AveragePriceLineMinMaxOrders", OBJPROP_STYLE, STYLE_DASH);
                 }
              }
           }
        }
     }
   return(avg_price_min_max_orders);
  }
 
EVGENII SHELIPOV #:

¿Puedes darme una pista? Aquí hay dos funciones para calcular y mostrar la parrilla de precios de las órdenes y las órdenes mínimas y máximas. Esta última la he escrito yo mismo basándome en el análogo de la función anterior. El primero funciona como se espera pero el segundo, el precio mínimo/máximo de la orden, no quiere mostrarse en el gráfico.

Por favor, ayúdenos a encontrar el error. Por favor, ayúdenme a encontrar el error.

//+----------------------------------------------------------------------------+
//| Расчет средней цены мин и макс                                             |
//+----------------------------------------------------------------------------+
double GetAveragePriceManMaxOrders()
  {
   double avg_price_min_max_orders = 0;
   double avg=NormalizeDouble((PriceMaxOrder()*FindLastLots() + PriceMinOrder()*GetMinLotOrder())
                                             /(FindLastLots() + GetMinLotOrder()),Digits());
   if(avg>0)
     {
      avg_price_min_max_orders = avg;
      if(ObjectFind(0,"AveragePriceLineMinMaxOrders"+IntegerToString(ot))!=0)
         ObjectCreate(0,"AveragePriceLineMinMaxOrders"+IntegerToString(ot),OBJ_HLINE, 0, 0, avg_price_min_max_orders);
      else
         ObjectSetDouble(0,"AveragePriceLineMinMaxOrders"+IntegerToString(ot),OBJPROP_PRICE, avg_price_min_max_orders);
      if(ot==0)
         ObjectSet("AveragePriceLineMinMaxOrders"+IntegerToString(ot),OBJPROP_COLOR, clrLime);
         ObjectSet("AveragePriceLineMinMaxOrders", OBJPROP_STYLE, STYLE_DASH);
      if(ot==1)
         ObjectSet("AveragePriceLineMinMaxOrders"+IntegerToString(ot),OBJPROP_COLOR, clrRed);
         ObjectSet("AveragePriceLineMinMaxOrders", OBJPROP_STYLE, STYLE_DASH);
     }
   return(avg_price_min_max_orders);
  }
 
MakarFX #:

No, Makar, no está funcionando.

 
EVGENII SHELIPOV #:

No, Makar, no está funcionando.

Enumerar las funciones

PriceMaxOrder()

BuscarÚltimosLotes()

PrecioMínimoOrden()

GetMinLotOrder()

BuscarÚltimosLotes()

GetMinLotOrder()

 
MakarFX #:

Enumerar las funciones

PriceMaxOrder()

BuscarÚltimosLotes()

PrecioMínimoOrden()

GetMinLotOrder()

BuscarÚltimosLotes()

GetMinLotOrder()

//+----------------------------------------------------------------------------+
//| Определение размера лота последнего ордера                                 |
//+----------------------------------------------------------------------------+
double FindLastLots()
  {
   int oldticket;
   double oldlots = 0;
   ticket = 0;

   for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
     {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               oldticket = OrderTicket();
               if(oldticket > ticket)
                 {
                  ticket = oldticket;
                  oldlots = OrderLots();
                 }
              }
           }
        }
     }
   return(oldlots);
  }
//+----------------------------------------------------------------------------+
//| Определение цены открытия макс лота                                        |
//+----------------------------------------------------------------------------+
double PriceMaxOrder()
  {
   double max_price = 0 ;
   max_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > max_ticket)
                    {
                     max_ticket = OrderTicket();
                     max_price = OrderOpenPrice();
                    }
                 }
              }
           }
        }
     }
   return(max_price);
  }
//+----------------------------------------------------------------------------+
//| Определение размера лота минимального ордера в сетке                       |
//+----------------------------------------------------------------------------+
double GetMinLotOrder()
  {
   double min_lot_order = 0;
   min_ticket=INT_MAX;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() < min_ticket)
                    {
                     min_ticket = OrderTicket();
                     min_lot_order = OrderLots();
                    }
                 }
              }
           }
        }
     }
   return(min_lot_order);
  }
//+----------------------------------------------------------------------------+
//| Определение цены открытия мин лота                                         |
//+----------------------------------------------------------------------------+
double PriceMinOrder()
  {
   double min_price = 0;
   min_ticket=INT_MAX;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() < min_ticket)
                    {
                     min_ticket = OrderTicket();
                     min_price = OrderOpenPrice();
                    }
                 }
              }
           }
        }
     }
   return(min_price);
  }
 
EVGENII SHELIPOV #:
//+----------------------------------------------------------------------------+
//| Расчет средней цены мин и макс                                             |
//+----------------------------------------------------------------------------+
double GetAveragePriceManMaxOrders()
  {
   double avg_price_min_max_orders = 0;
   if(OrdersTotal()>1)
     {
      avg_price_min_max_orders = NormalizeDouble((PriceMaxOrder()*FindLastLots() + PriceMinOrder()
                                 *GetMinLotOrder())/(FindLastLots() + GetMinLotOrder()),Digits());
      if(ObjectFind(0,"AveragePriceLineMinMaxOrders")!=0)
         ObjectCreate(0,"AveragePriceLineMinMaxOrders",OBJ_HLINE, 0, 0, avg_price_min_max_orders);
      else
         ObjectSetDouble(0,"AveragePriceLineMinMaxOrders",OBJPROP_PRICE, avg_price_min_max_orders);
     }
   return(avg_price_min_max_orders);
  }
 
Galim_V #:

Saludos, el script funciona como se lo pido.

Pero si lo muevo

en el archivo de inclusión, deja de ver la matriz de estructuras

la línea

No funciona así. No sé cómo arreglarlo.

Mueve la estructura al archivo de inclusión también, por encima de la clase.

 
Alexey Viktorov #:

Mueve la estructura al archivo de inclusión también, por encima de la clase.

(¡Muy bien!) ¡Gracias, Alexey!

 
MakarFX #:

Makar algo está mal. Me encanta, gracias. Yo mismo encontré una opción no muy bonita, pero que funciona.