Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 231

 

acemi soruları için özür dilerim... peki, kod geliştirmek için hangisine odaklanmalıyım? 4 mü 5 mi? belki anlamıyorum - sadece ticaret işlevselliği için 5'i mi seçmeliyim? MQL4s'den daha mı iyi?

 
@rrb1002 #: acemi soruları için özür dilerim... peki, kod geliştirmek için hangisine odaklanmalıyım? 4 mü 5 mi? belki anlamıyorum - sadece ticaret işlevselliği için 5'i mi seçmeliyim? MQL4s'den daha mı iyi?

Seçim sizin, ancak birisi bana eskisinin artık geliştirilmediğini ve tüm son gelişmelerin yenisinde olduğunu söylese, seçimimin açık olacağını düşünürdüm (üzerinde ağır basan başka koşullar yoksa).

EDIT: Bununla birlikte, profilinizde ABD'de olduğunuzu belirttiğiniz göz önüne alındığında, hangi brokerleri kullanmayı planladığınıza ve hangi platformları sunduklarına da bağlı olabilir.
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

mql5 dilinin özellikleri, incelikleri ve çalışma teknikleri

fxsaber, 2023.01.07 23:01

ABD / Avrupa'da zamanı çeviren iki tür broker vardır. Bu nedenle, özellikle, rollover zamanı kaydırılır.

Broker türü otomatik olarak belirlenebilir.

// Вычисление типа брокера (USA/Europe).

bool IsEuropeBroker()
{
  MqlCalendarValue Value[1];
  
  CalendarValueHistoryByEvent(840030016, Value, D'2022.11.03', D'2022.11.05');
  
  return(Value[0].time == ChartNewsTime(Value[0].time)); // https://www.mql5.com/ru/forum/357793/page5#comment_44225999
}

void OnStart()
{
  Print(AccountInfoString(ACCOUNT_SERVER) + " - " + (IsEuropeBroker() ? "Europe" : "USA"));
}


Bazı brokerler üzerinde çalıştırmanın sonuçları.

RannForex-Server - Europe
MetaQuotes-Demo - Europe
FXOpen-MT5 - USA
Alpari-MT5 - Europe
Tickmill-Live - USA
ICMarketsSC-MT5-2 - USA
Darwinex-Live - USA

Şu anda komut dosyası oldukça farklı sonuçlar üretiyor. Özelliklerini tam olarak anlayana kadar MT5-calendar'ı kullanmanızı önermiyorum.

 

MQL5'teki çok basit bir teknik, geri testleri ücretsiz olarak hızlandırmanıza olanak tanır - pozisyon / emir endekslerinin türe göre ezberlenmesi.


Daha önce yayınlanan hızlı kodun hızlandırılmasına bir örnek.

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

input int inAmountMagics = 50; // Сколько ТС эмулировать

// Для каждой ТС открываем позицию и отложку. MT4-код для лаконичности.
void OnInit()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))  
    for (int i = 0; i < inAmountMagics; i++)
    {
      OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i);
      
      OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1 e4*_Point, 0, 0, 0, NULL, i);
    }
}

#define  MAX_ORDERS 100

// Индексы позиций/ордеров по типам.
struct TYPE_INDEXES
{
  int Index[OP_SELLSTOP + 1][MAX_ORDERS];
  int Amount[OP_SELLSTOP + 1];
  
  // Заполнение индексов.
  void Fill( void )
  {
    ::ArrayInitialize(this.Amount, 0);
    
    for (int i = ::PositionsTotal() - 1; i >= 0; i--)
      if (::PositionGetTicket(i))
      {
        const int Type = (int)PositionGetInteger(POSITION_TYPE);
        
        this.Index[Type][this.Amount[Type]++] = i;
      }

    for (int i = ::OrdersTotal(true) - 1; i >= 0; i--)
      if (::OrderGetTicket(i))
      {
        const int Type = (int)OrderGetInteger(ORDER_TYPE);
        
        this.Index[Type][this.Amount[Type]++] = i;
      }
      
    return;          
  }
};

#undef  MAX_ORDERS

// Сбор информации с нужных позиций/ордеров. Максимально быстрый MT5-код.
double CountOrders( const int Type, const int Magic, const TYPE_INDEXES &TypeIndexes )
{
  double Res = 0;
  
  if (Type <= OP_SELL)
  {
    for (int i = TypeIndexes.Amount[Type] - 1; i >= 0; i--)
      if (PositionGetTicket(TypeIndexes.Index[Type][i]) && PositionGetInteger(POSITION_MAGIC) == Magic)
        Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) +
               PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL);
  }
  else
    for (int i = TypeIndexes.Amount[Type] - 1; i >= 0; i--)
      if (OrderGetTicket(TypeIndexes.Index[Type][i]) && OrderGetInteger(ORDER_MAGIC) == Magic)
        Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) +
               OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL);
        
  return(Res);
}

// Число для контроля корректности альтернативных реализаций.
double OnTesterValue = 0;
double OnTester() { return(OnTesterValue); }

void OnTick()
{
  TYPE_INDEXES TypeIndexes; // Индексы позиций/ордеров по типам.
  
  TypeIndexes.Fill(); // Заполнение индексов.
  
  // Симулируем работу по всем ТС.
  for (int i = 0; i < inAmountMagics; i++)
    OnTesterValue += CountOrders(POSITION_TYPE_BUY, i, TypeIndexes) + 
                     CountOrders(POSITION_TYPE_SELL, i, TypeIndexes) +
                     CountOrders(ORDER_TYPE_BUY_LIMIT, i, TypeIndexes) +
                     CountOrders(ORDER_TYPE_SELL_LIMIT, i, TypeIndexes);  
}

Pozisyonları/emirleri türlerine göre ayırmak mantıklıdır.

 
MQL4 EA'yı MQL5'e nasıl dönüştürebilirim?
 
Herhangi bir çift için hayali bir sıfıra ihtiyacınız varsa.
void OnStart()
{
  double d = 1;
  
  Print(d + d * 1 e-17 == d); // true
  Print(d * 1 e-17);
}
 
fxsaber #:
Herhangi bir çift için hayali bir sıfıra ihtiyacınız varsa.

DBL_EPSILON

1,0+DBL_EPSILON != 1,0 koşulunun geçerli olduğu en küçük sayı.

2.2204460492503131e-016

 
Slava #:

DBL_EPSILON

1,0+DBL_EPSILON != 1,0 koşulunun sağlandığı en küçük sayı.

2.2204460492503131e-016

Teşekkür ederim!

 

DBL_EPSILON

1,0+DBL_EPSILON != 1,0 koşulunu sağlayan en küçük sayı

2.2204460492503131e-016


İngilizce yorum yaptığım için lütfen beni bağışlayın, Rusça bilmiyorum.

Bu şu anlama geliyor:

d * (1 + DBL_EPSILON) != d
d * (1 + 0.5 * DBL_EPSILON) == d

çünkü DBL_EPSILON göreli hata oranıdır. Göreli, sayının büyüklüğüne göre anlamına gelir.

1.0'da hata oranı = 1 * 2 .2204460492503131e-016 (DBL_EPSILON)

d'de hata oranı = d * DBL_EPSILON .

Bilgisayar d ve d * (1 + 0.5*DBL_EPSILON) arasında ayrım yapamaz, bu nedenle her ikisini de aynı ikiliye kodlar.
Böylece, tam (ikili) karşılaştırma için true elde edersiniz ==
 
Slava #:

DBL_EPSILON

1,0+DBL_EPSILON != 1,0 koşulunun sağlandığı en küçük sayı.

2.2204460492503131e-016

Bu kötü bir açıklama, çünkü.

void OnStart()
{
  double d = 1 e5;
  
  Print(d + d * 0.1 == d * (1 + 0.1)); // false
}