Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1705

 

Grüße, das Skript funktioniert so, wie ich es verlange.

//+------------------------------------------------------------------+
//|                                                       Око_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'));

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

Aber wenn ich sie bewege

class Ohistory

in die Include-Datei einfügt, sieht es das Array der Strukturen nicht mehr

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

die Linie

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

So funktioniert das nicht. Ich kann nicht herausfinden, wie man das beheben kann.

 

Können Sie mir einen Tipp geben? Hier sind zwei Funktionen zur Berechnung und Anzeige des Preisgitters von Aufträgen und Min/Max-Aufträgen. Letztere habe ich auf der Grundlage der Analogie der vorherigen Funktion selbst geschrieben. Die erste funktioniert wie erwartet, aber die zweite, der Min/Max-Orderpreis, will nicht im Diagramm erscheinen.

Bitte helfen Sie uns, den Fehler zu finden. Bitte helfen Sie mir, den Fehler zu finden.

//+----------------------------------------------------------------------------+
//| Расчет средней цены (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 #:

Können Sie mir einen Tipp geben? Hier sind zwei Funktionen zur Berechnung und Anzeige des Preisgitters von Aufträgen und Min/Max-Aufträgen. Letztere habe ich auf der Grundlage der vorherigen Funktion selbst geschrieben. Die erste funktioniert wie erwartet, aber die zweite, der Min/Max-Orderpreis, will nicht im Diagramm erscheinen.

Bitte helfen Sie uns, den Fehler zu finden. Bitte helfen Sie mir, den Fehler zu finden.

//+----------------------------------------------------------------------------+
//| Расчет средней цены мин и макс                                             |
//+----------------------------------------------------------------------------+
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 #:

Nein, Makar, es funktioniert nicht.

 
EVGENII SHELIPOV #:

Nein, Makar, es funktioniert nicht.

Auflistung der Funktionen

PreisMaxBestellung()

FindLastLots()

PriceMinOrder()

GetMinLotOrder()

FindLastLots()

GetMinLotOrder()

 
MakarFX #:

Auflistung der Funktionen

PreisMaxBestellung()

FindLastLots()

PriceMinOrder()

GetMinLotOrder()

FindLastLots()

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 #:

Grüße, das Skript funktioniert so, wie ich es verlange.

Aber wenn ich sie bewege

in die Include-Datei einfügt, sieht es das Array der Strukturen nicht mehr

die Linie

So funktioniert das nicht. Ich kann nicht herausfinden, wie man es reparieren kann.

Verschieben Sie die Struktur auch in die Include-Datei, oberhalb der Klasse.

 
Alexey Viktorov #:

Verschieben Sie die Struktur auch in die Include-Datei, oberhalb der Klasse.

In Ordnung!) Danke, Alexey!

 
MakarFX #:

Makar, hier stimmt etwas nicht. Ich liebe es, danke. Ich habe selbst eine nicht ganz so hübsche Lösung gefunden, aber sie funktioniert.

Grund der Beschwerde: