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

 
natawik:

Hallo zusammen, bitte um Hilfe!

Ich habe ein solches Problem. Ich kaufte eine vpc von mql5 alles funktioniert gut, installiert einen Experten, eingerichtet 8 Charts und legte einen Experten. Und ich habe das Ganze auf vpc übertragen.

Ich musste Metatrade von meinem Computer deinstallieren, weil es nicht meins war.

Und wenn ich jetzt von meinem Computer aus reingehe.

Alles funktioniert, der Experte. Es funktioniert, aber ich kann keine Änderungen an den Einstellungen vornehmen. Wie kann ich den EA und die Zeitpläne zurückgeben, so dass ich sie von meinem Computer aus verwalten kann?

Ich danke Ihnen!

Für diesen Fall müssen Sie Profile speichern. Um es später unter der UPU hochzuladen.

 

Wer weiß, wie man alle Daten aus dem Bericht ohne Verzerrung in exel exportiert?

Wenn ich nur einige der Daten in der Spalte "Gewinn" kopiere, werden sie als Datum exportiert, z.B. Januar 94 statt 1.94.

Egal, wie ich versuche zu speichern, ich kann dieses Problem nicht loswerden.

 
законопослушный гражданин:

Wer weiß, wie man alle Daten aus dem Bericht ohne Verzerrung in exel exportiert?

Wenn ich nur einige der Daten in der Spalte "Gewinn" kopiere, werden sie als Datum exportiert, z.B. Januar 94 statt 1.94.

Egal, wie ich versuche zu speichern, ich werde dieses Problem nicht los.

Ersetzen Sie vor dem Hochladen oder vor dem Öffnen der exportierten Datei das Trennzeichen zwischen dem ganzzahligen Teil und dem Bruchteil in Excell durch einen Punkt.

 
законопослушный гражданин:

Wer weiß, wie man alle Daten aus dem Bericht ohne Verzerrung in exel exportiert?

Wenn ich nur einige der Daten in der Spalte "Gewinn" kopiere, werden sie als Datum exportiert, z.B. Januar 94 statt 1.94.

Egal, wie ich versuche, es zu speichern, ich kann das Problem nicht loswerden.

Also

 
SGarnov:

Vielleicht sollten Sie auch die Anzahl der ausgelösten Stopps berücksichtigen. Zum Beispiel wird der EA einen Stop in der Historie finden, und wenn es zwei davon gibt, sollte er sie beide zu drei oder vier addieren, alles hängt von der externen Einstellung "Anzahl der Stop Losses" ab.

In Ihrem Fall - und nicht nur in Ihrem Fall, sondern in den meisten Fällen - ist es am besten, wenn Sie die Tickets der offenen Aufträge in einem Array aufbewahren, anstatt in der Handelshistorie nach geschlossenen Aufträgen zu suchen. Prüfen Sie in regelmäßigen Abständen, ob dieser Auftrag durch eine einfache Bedingung geschlossen wurde.

if(OrderCloseTime() != 0) // значит ордер закрылся…

Wenn der Auftrag geschlossen wurde, kann er über das Ticket ausgewählt und überprüft werden, ob er mit Gewinn geschlossen wurde oder nicht. Sie können auch den Abstand zwischen der offenen Position und dem Stopp überprüfen und zu diesem Abstand so viel hinzufügen, wie Ihre Mutter erlaubt.

Nach all diesen Manipulationen sollten wir die Größe des Arrays auf 0 zurücksetzen und es erneut mit den Ticks der zum aktuellen Zeitpunkt in der Schleife geöffneten Aufträge füllen, wodurch sich die Größe des Arrays erhöht.

 
Vladislav Andruschenko:

müssen Sie Profile für diese Gelegenheit speichern. Um es später unter der UPU hochzuladen.

Wie wäre es, wenn ich das VPN ausschalte und alles wieder einschalte und das VPN wieder einschalte und alle Graphen und EA an Sie übertrage?
Es wird doch keine alten Daten über Sie geben, oder?
 

Hallo

Helfen Sie mir, den Code zu verstehen

Beigefügt ist ein Stück Code, das Klassen hat und alles funktioniert gut, aber

Ich möchte einige Funktionen aus den Klassen in eine eigene Funktion einbinden und schreibe Fehler

Beispiel

void OpenHandPosition(int tp)
   {
      string lot=0.01
      bool response = actionTrade.ManageOrderSend(tp, lt, 0, 0, 0, 0, 0);//
   }

Das funktioniert so

und das funktioniert nicht

void OpenHandPosition(int tp)
   {

    int stopLoss   = GetStopLossPoints(size);
    int takeProfit = GetTakeProfitPoints();
    bool response = actionTrade.ManageOrderSend(tp, lt , stopLoss, takeProfit, 0, 0, 0);

   }

diese Funktion funktioniert

void StrategyTrader::DoEntryTrade(TradeDirection tradeDir)

und dieser nicht

OpenHandPosition(int tp)

Hilfe

Dateien:
test.mq5  21 kb
 
SGarnov:

Ich bin zu dem Schluss gekommen, dass es schwierig zu implementieren ist, Ihr Code ist viel einfacher, klarer und logischer, aber ..... passt irgendwie auch nicht zusammen. Die Hauptsache ist, dass man nicht aufgibt.

Das scheint in Ordnung zu sein. Probieren Sie es aus, fragen Sie...

//+------------------------------------------------------------------+
//|                                                 SGarnov.v2.1.mq4 |
//|                                           Copyright 2020, DrMak. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, DrMak."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//--- input parameters
input int      T_Profit = 2;     // Коэффициент Take Profit
input int      S_Loss   = 200;   // Уровень Stop Loss
input double   O_Lots   = 0.01;  // Лоты
input int      SL_Count = 2;     // Количество убыточных ордеров
input int      Slippage = 30;    // Проскальзывание
input int      N_Magic  = 888;   // Magic

datetime T_Start;
double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 
   Comment("");
//--- 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   t_profit = S_Loss*T_Profit * Point();
   tp_price = NormalizeDouble(t_profit+GetPointLoss(), Digits);
//---
   s_loss   = MathMax(S_Loss, MarketInfo(_Symbol, MODE_STOPLEVEL)) * Point();
   sl_price = NormalizeDouble(s_loss, Digits);
//---
   // Удаляем отложенный ордер после профита
   if(CountOrders(-1)==1) DeletePending();
//---
   // Проверяем серию убыточных ордеров
   if(CountOrders(-1)==1&&GetLossOrders()<SL_Count)
     {
      // Устанавливаем отложенный ордер
      SendPending();
     }
//---
   // Проверяем наличие ордеров
   if(CountOrders(-1)>0)
     {
      // Устанавливаем StopLoss/TakeProfit
      ModifyOrder();
     }
//---
   int a=(int)TimeStart();
   int b=GetLossOrders();
   int c=(int)((GetPointLoss()+t_profit)/Point);
   
   Comment("Время начала цикли: ",TimeToStr(a,TIME_SECONDS),"\n",
           "Серия StopLoss ордеров: ",b,"\n",
           "Размер TakeProfita: ",c);
  }
//+------------------------------------------------------------------+
//| Модификация ордера                                               |
//+------------------------------------------------------------------+
void ModifyOrder()
  {
   double op=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderStopLoss()==0)
              {
               if(OrderType()==OP_BUY)
                 {op=OrderOpenPrice();
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), op-sl_price, op+tp_price, OrderExpiration()))
                    {Print("Ордер модифицирован");}
                  else
                    {Print("Ошибка модификации ордера:", GetLastError());}
                 }
               if(OrderType()==OP_SELL)
                 {op=OrderOpenPrice();
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), op+sl_price, op-tp_price, OrderExpiration()))
                    {Print("Ордер модифицирован");}
                  else
                    {Print("Ошибка модификации ордера:", GetLastError());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
//|  0 - ордера типа BUY          1 - ордера типа SELL               |
//|  2 - ордера типа BUYLIMIT     3 - ордера типа SELLLIMIT          |
//|  4 - ордера типа BUYSTOP      5 - ордера типа SELLSTOP           |
//|  6 - ордера типа Balance     -1 - Все типы ордеров               |
//+------------------------------------------------------------------+
int CountOrders(int or_ty=-1) 
  {
   int cnt=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==_Symbol)
           {
            if(or_ty<0 || or_ty==OrderType()) cnt++;
           }
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
//| Установка отложенного ордера                                     |
//+------------------------------------------------------------------+
void SendPending()
  {
   double op=0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderStopLoss() != 0)
                 {
                  op=OrderStopLoss();
                  if(OrderSend(_Symbol,OP_SELLSTOP,O_Lots,op,Slippage,0,0,NULL,N_Magic))
                    {Print("Отложенный ордер установлен");}
                  else
                    {Print("Ошибка установки отложеного одера: ", GetLastError());}
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss() != 0)
                 {
                  op=OrderStopLoss();
                  if(OrderSend(_Symbol,OP_BUYSTOP,O_Lots,op,Slippage,0,0,NULL,N_Magic))
                    {Print("Отложенный ордер установлен");}
                  else
                    {Print("Ошибка установки отложеного одера: ", GetLastError());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|  Возвращает пункты убытка закрытых ордеров с начала цикла        |
//+------------------------------------------------------------------+
double GetPointLoss()
  {
   double result=0,b=0,s=0;;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderProfit()<0)
                 {
                  if(OrderCloseTime()>=TimeStart())
                    {
                     if(OrderType()==OP_BUY)
                       {
                        b+=OrderOpenPrice()-OrderClosePrice();
                       }
                     if(OrderType()==OP_SELL)
                       {
                        s+=OrderClosePrice()-OrderOpenPrice();
                       }
                    }
                 }
              }
           }
        }
     }
   return(b+s);
  }
//+------------------------------------------------------------------+
//| Удаление отложенного ордера                                      |
//+------------------------------------------------------------------+
void DeletePending()
  {
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
              {
               if(OrderMagicNumber() == N_Magic)
                 {
                  if(OrderDelete(OrderTicket()))
                    {Print("Отложенный ордер удален");}
                  else
                    {Print("Ошибка удаления отложеного одера: ", GetLastError());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Возвращает время начала цикла                                    |
//+------------------------------------------------------------------+
datetime TimeStart()
  {
   datetime ts1=0,ts2=0;
   if(OrdersTotal()!=0)
     {
      for(int i = OrdersTotal() - 1; i >= 0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS))
           {
            if(OrderMagicNumber()!=N_Magic)
              {
               if(OrderType()==OP_BUY || OrderType()==OP_SELL)
                 {
                  if(OrderSymbol()==_Symbol)
                    {
                     if(ts1<OrderOpenTime())
                       {
                        ts1=OrderOpenTime();
                       }
                    }
                 }
              }
           }
        }
      for(int pos=0; pos<OrdersHistoryTotal(); pos++)
        {
         if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
           {
            if(OrderMagicNumber()!=N_Magic)
              {
               if(OrderType()==OP_BUY || OrderType()==OP_SELL)
                 {
                  if(OrderSymbol()==_Symbol)
                    {
                     if(ts2<OrderOpenTime())
                       {
                        ts2=OrderOpenTime();
                       }
                    }
                 }
              }
           }
        }
     }
   return(MathMax(ts1,ts2));
  }
//+------------------------------------------------------------------+
//|  Возвращает кол-во серии убыточных ордеров                       |
//+------------------------------------------------------------------+
int GetLossOrders()
  {
   int cnt=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if((OrderSymbol()==_Symbol))
           {
            if(OrderCloseTime()>=TimeStart())
              {
               if(OrderProfit()<0) cnt++;
              }
           }
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
 
MakarFX:

Das scheint in Ordnung zu sein. Probieren Sie es aus, fragen Sie...

Danke für die Hilfe, erst nächste Woche werde ich die Korrektheit des EAs schreiben können, heute ist Freitag und ich suche nicht mehr nach Markteintrittspreisen.

 
natawik:
Was ist, wenn ich das VPN ausschalte und alles wieder einschalte, dann das VPN wieder einschalte und alles an Sie übertrage, die Grafiken und den Expert Advisor?
Es wird doch keine alten Daten über Sie geben, oder?
Ich stoße oft auf solche Probleme, wenn ich einen PC einrichte, das Terminal konfiguriere, dann alles migriere, weiterarbeite, Grafiken ändere usw., und dann bam, muss etwas geändert werden.... Ich muss das alles noch einmal machen.
Grund der Beschwerde: