Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1054

 

Igor Makanu:

CTrade bietet standardmäßig keinen sofort einsatzbereiten Dienst

Auf MT4 gibt es Handelssachen, die in einer Zeile kodiert sind. Auf dem MT5 kann man das Gleiche über SB nicht einmal in hundert Zeilen tun. Bei reinem MQL5 ist es noch schlimmer. Das ist in Ordnung.

 

Danke, gutes Beispiel, ich werde mich damit befassen, hier ist ein Skript, das ich für MT4 entworfen habe - Gewinn in Pips bestimmen:

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

Ich habe es von Grund auf in 10 Minuten geschrieben? - Nun, was das angeht, ist die Logik einfach und geradlinig - du nimmst es und schreibst es, in MT5 diskutieren wir bisher nur über ein kugelförmiges Pferd in einem Vakuum... wenn Geschäfte und ob es Aufträge gibt, links, um Arten von Konten Netting oder Hedge zu diskutieren.... und wir werden bis morgen früh etwas schreiben.

 
Igor Makanu:

Danke, gutes Beispiel, ich werde es studieren, ich habe ein Skript für MT4 - bestimmen Gewinn in Pips

Ich brauche Ihnen nicht zu sagen, wie Sie dieses Skript im MT5 ausführen können. Das Skript selbst ist jedoch fehlerhaft.

Zuerst werde ich Ihnen die Geschichte zeigen

und das Ergebnis der Ausführung

Прибыль последнего закрытого ордера -259 пунктов


Hier sind Fehler

int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++) // Надо бежать в обратную сторону, т.к. последняя позиция может быть закрыта в ту же секунду, что и предпоследняя.
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t) // В отличие от MT4, в MT5 это можно не делать - сортировка по времени закрытия есть.
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point); // При таком вычислении легко потерять один пункт.
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
 
fxsaber:

Und die Fehler hier.

При таком вычислении легко потерять один пункт.

Ich habe noch nie darüber nachgedacht, das Schema scheint Standard zu sein: 2 Preise - die Differenz finden und durch Punkte teilen

Ich stimme mit dem Rest überein, aber ich muss nachdenken, das Schema der Auftragswiederholung ist klassisch und ich möchte die Zeit mit der höchsten.... nur für den Fall vergleichen. Ich muss nachdenken, auch wenn es das erste Mal ist, dass ich es tun muss - 99,99% der Zeit versucht niemand, hft TS auf MT4 zu handeln

 
Igor Makanu:

Ich habe nie darüber nachgedacht, das Schema scheint Standard zu sein: 2 Preise - die Differenz finden und durch Punkte teilen

Verlust beim Casting double -> int.

Ich stimme mit dem Rest überein, aber ich muss nachdenken, das Schema der Vollstreckung ist klassisch, und ich möchte die Zeit mit der höchsten.... nur für den Fall vergleichen. ich muss nachdenken, auch wenn es das erste Mal ist, dass ich es tun muss - in 99,99% der Fälle versucht niemand, hft TS auf MT4 zu handeln

HFT hat damit nichts zu tun. Das Skript CloseAll kann durchaus zwei Positionen innerhalb einer Sekunde schließen. In MT4 müssen Sie vergleichen, in MT5 ist das nicht nötig. Und es ist wahrscheinlich einfacher, durch ArraySort zu vergleichen (wenn Sie z.B. schnell zur vorletzten geschlossenen Position wechseln wollen).

 
fxsaber:

Der Verlust beim Casting double -> int.

das ist alles klar, aber wie berechne ich die Differenz von 2 Preisen korrekt in ganzen Punkten?

 
Igor Makanu:

Das ist alles klar, aber wie berechne ich die Differenz in Pips zwischen 2 Preisen?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Ich brauche Hilfe bei der Berechnung der Gesamtpips für eine heute geschlossene Order (Mql5)

fxsaber, 2017.10.25 01:00

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

int PriceToInteger( const double Price, const double point )
{
  return((int)(Price / point + 0.1));
}

int GetTotalPips( const datetime From = 0 )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      if (OrderCloseTime() < From)
        break;
      else if (OrderType() <= OP_SELL)
      {
        const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
        
        Res += OrderType() ? PriceToInteger(OrderOpenPrice(), point) - PriceToInteger(OrderClosePrice(), point)
                           : PriceToInteger(OrderClosePrice(), point) - PriceToInteger(OrderOpenPrice(), point);
      }
        
  return(Res);
}

void OnStart()
{
  datetime Today = TimeCurrent();
  
  Today -= Today % PeriodSeconds(PERIOD_D1);
  
  Alert(GetTotalPips(Today));
}
 
fxsaber:

Ich danke Ihnen!

Das hat mir besonders gut gefallen.

const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);

Ich werde das im Hinterkopf behalten, ich schreibe normalerweise alles in globaler Sichtbarkeit, Ihr Beispiel liest sich viel besser


....


Würde in der Bestellschleife SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT); jedes Mal neu berechnet werden, weilOrderSymbol() jedes Mal anders ist?

 

Forum für Handel, automatisierte Handelssysteme und Strategietests

Fragen von Anfängern MQL5 MT5 MetaTrader 5

Igor Makanu, 2019.06.04 18:43

Danke, gutes Beispiel, ich werde es mir ansehen, hier ist ein Skript, das ich für MT4 entworfen habe - Gewinn in Pips bestimmen:

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

Von Grund auf in 10 Minuten geschrieben? - Nun, ungefähr so, die Logik ist einfach und klar - Sie nehmen es und schreiben es, in MT5 sprechen wir nur über ein kugelförmiges Pferd in einem Vakuum... wenn Geschäfte und ob es Aufträge gibt, links, um Arten von Konten Netting oder Hedge zu diskutieren.... und wir werden morgen früh etwas schreiben.

Und darf ich fragen, warum wir den absoluten Wert der Differenz zwischen dem Eröffnungs- und dem Schlusskurs nehmen und dann, wenn der Gewinn der Position kleiner als Null ist, den Wert durch ein Minuszeichen ersetzen sollen.
 
Alexey Viktorov:
Und darf ich fragen, warum wir den absoluten Wert der Differenz zwischen dem Eröffnungs- und dem Schlusskurs nehmen und dann, wenn der Gewinn der Position kleiner als Null ist, den Wert durch ein Minuszeichen ersetzen sollten.

Ich habe es on the fly geschrieben, wie ich es wollte - ich wollte +100 Punkte oder -100 Punkte ausgeben, es war eine Frage des Geschmacks - ich hatte keine spezifische Aufgabe, aber Bedingungen zu schreiben, um den Auftragstyp zu bestimmen und den Eröffnungs- und Schlusskurs zu vergleichen, es schien, dass es zu viele zusätzliche Zeilen geben würde...

ZS: Dies ist ein Forum für Programmierer, nicht wahr? - Sie können einen Code (insbesondere den eines anderen) 10 Mal optimieren, um 5 Zeilen durch 4 zu ersetzen)))