ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Как се създава и тества forex система. Expert Advisors и бектестове на системи за автоматична търговия.
User avatar
saxsten
Posts: 1389
Joined: 04 Apr 2010, 23:16
12 получени
6 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by saxsten » 10 Jun 2018, 14:49

Mateev wrote:
02 Jun 2018, 22:41
Публикувам кода на двата експерта и на класа към тях, въпреки че не е завършен напълно. Правя го това най-вече заради олигофрена saxsten, който не спира да плещи простотии и да ръси обиди или измислици, които живеят само в неговия птичи мозък.

Обещах в почивните дни да напиша кода на стратегията на Knestin и днес от ранни зори само това правя. За съжаление не успях да го завърша, а трябва да си лягам, че утре имам други важни ангажименти. Останаха недонаписани още 3 метода, които ще се опитам да ги завърша утре вечер или в понеделник вечер.

Ето кода на класа с търговската логика:

Code: Select all

//+------------------------------------------------------------------+
//|                                                     Strategy.mqh |
//|                                        Copyright 2018, Mateev SC |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Rosimir Mateev"
#property link      " "
#property version   "1.01"
#property strict

//====================================================================
// Клас, описващ функционалноста на една стратегия по логиката на Knestin от форума Trader.bg

class CStrategy
  {
private: //Частни променливи и методи, видими само вътре в класа
  string symbol;     // Валутна двойка, върху която ще работи стратегията
  int    SL,TP;      // Stop Loss и Take Profit на позициите в пипсове (4 знака)
  int    Magic;      // Уникален идентификатор на ордерите на стратегията
  double OpenHour;   // Часа на отваряне на позицията
  double OpenPeriod; // Период за отваряне в часове (не трябва да се прехвърля в следващото денонощие)
  double LivePeriod; // Живот на позициите в часове
  
  // Статус на стратегията (на какъв етап от цикъла се намира)
  // 0 - Няма отворени позиции. Чака се настъпването на времето за отваряне на нови позиции.
  // 1 - Времето за отваряне е настъпило. Отварят се една BUY и една SELL позиции.
  // 2 - Позициите са отворени. Чака се настъпването на времето за затваряне.
  // 3 - Времето за затваряне е настъпило. Започва затварянето на позициите.
  int State; // Статус на стратегията
  
  int  OpenPositionsCount(); // Сканира отворените позиции и връща техния брой
  void CheckForOpen();   // Проверява дали е настъпил момента за отваряне на позиции. Ако да, сменя статуса на експерта.
  void CheckForClose();  // Проверява дали е настъпил момента за затваряне на позиции. Ако да, сменя статуса на експерта.
  void OpenPositions();  // Отваря една Buy и една Sell позиции. Сменя статуса, ако отварянето е успешно.
  void ClosePositions(); // Затваря активните позиции. Сменя статуса, ако затварянето е успешно.
  
public: // Публични променливи и методи, видими за външните програми
  CStrategy(); // Конструктор на класа
 ~CStrategy(); // Деструктор на класа
  
  // Инициализиране на параметрите на стратегията
  void SetSymbol(string sym){symbol=sym;};  // Инициализира валутната двойка
  void SetMagic (int value) {Magic=value;}; // Инициализира Magic Number на позициите
  void SetSL    (int value) {SL=value;};    // Инициализира Stop Loss на позициите
  void SetTP    (int value) {TP=value;};    // Инициализира Take Profit на позициите
  void SetOpenHour  (double value); // Инициализира часа на отваряне на позицията
  void SetOpenPeriod(double value); // Инициализира периода за отваряне в часове (не трябва да се прехвърля в следващото денонощие)
  void SetLivePeriod(double value); // Инициализира живота на позициите в часове  
  
  // Други методи
  void Run(); // Стартира логиката на стратегията
  };
//====================================================================
// Конструктор на класа. Извиква се автоматично при създаването на нов обект на класа.
CStrategy::CStrategy()
  {
    // При създаването на обекта всички променливи автоматично сe инициализират със стойност 0,
    // а всички стрингове и указатели към обекти - със стойност NULL.
    // Ако случайно не се направи никаква външна инициализация, 
    // то тогава стратегията ще работи със следните стойности по подразбиране:
    symbol = Symbol();
    SL = 300;
    TP = 600;
    OpenHour   = 14.0; // Начало на периода за отваряне на позиции - 14:00 часа
    OpenPeriod =  0.5; // Продължителност на периода за отваряне на позиции - половин час
    LivePeriod =  5.0; // Живот на позициите - 5 часа (до 19:00 часа)
    if(OpenPositionsCount()>0) State = 2; // 2 - Позициите са отворени. Чака се настъпването на времето за затваряне.
  }
//--------------------------------------------------------------------
// Деструктор на класа. Извиква се автоматично преди унищожаването на обекта на класа.
CStrategy::~CStrategy()
  {
    // При унищожаване на обекта динамичната памет, заета от стринговете, се освобождава автоматично.
  }
  
//====================================================================
// Инициализира часа на отваряне на позицията

void CStrategy::SetOpenHour(double value)
  {
    OpenHour = value;
    if (OpenHour <  0.0) OpenHour =  0.0;
    if (OpenHour > 23.9) OpenHour = 23.9;
    
    // Проверка дали края на периода се прехвърля в следващото денонощие
    if (OpenHour + OpenPeriod >= 24) OpenPeriod = 23.999 - OpenHour;
  }
  
//====================================================================
// Инициализира периода за отваряне в часове
// Не трябва да е по-къс от 1 минута и по-дълъг от 1 час
// Не трябва да се прехвърля в следващото денонощие

void CStrategy::SetOpenPeriod(double value)
  {
    OpenPeriod = value;
    if (OpenPeriod < 0.017) OpenPeriod = 0.017; // Около 1 минута
    if (OpenPeriod > 0.999) OpenPeriod = 0.999; // Малко по-малко от 1 час
    
    // Проверка дали края на периода се прехвърля в следващото денонощие
    if (OpenHour + OpenPeriod >= 24) OpenPeriod = 23.999 - OpenHour;
  }
  
//====================================================================
// Инициализира живота на позициите в часове
// Не трябва да е по-къс от 1 час

void CStrategy::SetLivePeriod(double value)
  {
    LivePeriod = value;
    if (LivePeriod < 1.0) LivePeriod = 1.0; // 1 час
  }
  
//====================================================================     
// Сканира отворените позиции и връща техния брой   

int CStrategy::OpenPositionsCount()   
  {
    int count = 0; // Брой на отворените позиции
    int total = OrdersTotal(); // Общ брой на всички отворени ордери в терминала  
    for (int pos=0; pos<total; pos++)
      {
        if(!OrderSelect(pos,SELECT_BY_POS)) continue; // Има някаква грешка при селектването на този ордер от списъка
        if(OrderMagicNumber()!=Magic) continue;       // Ордера не е от текущата стратегия
        if(OrderSymbol()!=symbol) continue;           // Ордера не е по текущия символ
        count++; 
      }
    return(count);
  }
  
//====================================================================
// Проверява дали е настъпил момента за отваряне на позиции. Ако да, сменя статуса на стратегията.
  
void CStrategy::CheckForOpen()
  {
    if(State!=0) return; // Неправилно извикване на функцията. Трябва да се извиква само когато State = 0.
   
    datetime now = TimeLocal(); // Чете текущото време
    
    // Определя времената t1 и t2 на периода, в който е разрешено отварянето на 2 нови позиции
    MqlDateTime day; TimeToStruct(now,day);
    day.hour = int(OpenHour);
    day.min  = int((OpenHour-day.hour)*60); // Извличане на минутите от часа, който може и да не е цяло число
    day.sec  = 0;
    
    datetime t1 = StructToTime(day);           // Време на началото на периода
    datetime t2 = t1 + int(OpenPeriod * 3600); // Време на края на периода
    
    // Проверка дали момента now е между времената t1 и t2
    if((now>=t1) && (now<t2)) State = 1; // Вече е настъпило времето за отваряне на позиция и затова State става равно на 1.
  } 
  
//====================================================================
// Отваря една Buy и една Sell позиции. Сменя статуса, ако отварянето е успешно. 
 
void CStrategy::OpenPositions()
  {
    if(State!=1) return; // Неправилно извикване на функцията. Трябва да се извиква само когато State = 1.
    
    // Отваряне на Buy позиция
    // Отваряне на Sell позиция
    
    if (OpenPositionsCount()==2) State = 2;
  }
    
//====================================================================
// Проверява дали е настъпил момента за затваряне на позиции. Ако да, сменя статуса на експерта. 
 
void CStrategy::CheckForClose()
  {
    if(State!=2) return; // Неправилно извикване на функцията. Трябва да се извиква само когато State = 2.
    
    // Проверка дали е настъпил момента за затваряне
    // Ако да, сменя статуса от 2 на 3   
  }  
 
//==================================================================== 
// Затваря активните позиции. Сменя статуса, ако затварянето е успешно.
 
void CStrategy::ClosePositions()
  {
    if(State!=3) return; // Неправилно извикване на функцията. Трябва да се извиква само когато State = 3.
    
    // Затваря позициите, без да проверява за грешка.
    // Ако някоя от тях не се затвори поради някаква причина, на следващия тик ще се направи нов опит.
    
    // Проверка дали позициите са затворени коректно, и ако да - сменя се статуса на 0.  
    if (OpenPositionsCount()==0) State = 0;
  } 
     
//====================================================================  
// Стартиране на логиката на стратегията

void CStrategy::Run()
  {
    // Ако търговията не е разрешена, приключваме обработката.
    if(!IsTradeAllowed()) return;
    
    // Извикват се различни функции в зависимост от последния статус на стратегията
    switch(State)
      {
        case 0: CheckForOpen();   break; // Няма отворени позиции. Чака се периода от време за отваряне.
        case 1: OpenPositions();  break; // Времето за отваряне е настъпило. Отварят се 2 позиции. 
        case 2: CheckForClose();  break; // Има отворени позиции. Чака се времето за затваряне.
        case 3: ClosePositions(); break; // Времето за затваряне е настъпило. Затварят се позициите.
      }
  }
  

Ето кода на експерта, който търгува само върху един символ - този, върху който е пуснат:

Code: Select all

//+------------------------------------------------------------------+
//|                                                     KnestinS.mq4 |
//|                                        Copyright 2018, Mateev SC |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Rosimir Mateev"
//#property link      ""
//#property version   "1.01"
#property strict
#property description "Стратегия на Knestin от форума Trader.bg, със следната логика:"
#property description "1. В 14:00 се откриват Sell и Buy позиции с фиксиран SL и TP"
#property description "3. В 19:00 се закриват и двете позиции, ако все още са активни"
#property description "Модификация от Mateev, за да е удобно тестването с различни параметри:"
#property description "1. Времето за отваряне на позиции е абсолютно и става параметър"
#property description "2. Въвежда се период от време, през който могат да се отварят позиции"
#property description "3. Въвежда се период от време, след който позициите трябва да се затворят"
#property description "4. Експерта работи върху текущия символ"

#include "Strategy.mqh" // Клас с кода на една стратегия

//====================================================================
// Параметри на експерта, които могат да се настройват в прозореца Inputs

input double OpenHour   = 14.0; // Час на отваряне на позициите
input double OpenPeriod =  0.5; // Период за отваряне в часове
input double LivePeriod =  5.0; // Живот на позициите в часове
input int    Magic      =    1; // Magic Number
input int    SL         =  300; // Stop Loss in points
input int    TP         =  600; // Take Profit in points

//====================================================================
// Глобални променливи на експерта

CStrategy Strategy; // Обект на класа CStrategy

//====================================================================
// Инициализация на експерта

int OnInit()
  {
    // Инициализиране на параметрите на стратегията
    Strategy.SetSymbol(Symbol());
    Strategy.SetMagic(Magic);
    Strategy.SetSL(SL);
    Strategy.SetTP(TP);
    Strategy.SetOpenHour  (OpenHour);
    Strategy.SetOpenPeriod(OpenPeriod);
    Strategy.SetLivePeriod(LivePeriod);    
    
    // Създаване на обект на таймер с период от 1 секунда
    EventSetTimer(1); 
    return(INIT_SUCCEEDED);
  }
  
//====================================================================
// Деинициализация на експерта (изтриване на обектите в динамичната памет)

void OnDeinit(const int reason)
  {
    // Унищожаване (изтриване) на обекта на таймера
    EventKillTimer(); 
    // Тъй като обектите на двете стратегии са статични,
    // то техния деструктор се извиква автоматично при деинициализацията на експерта 
  }
  
//====================================================================
// Стартира се на всеки тик

void OnTick()
  {
    Strategy.Run(); // Стартиране на логиката на стратегията
  }
  
//====================================================================
// Стартира се всяка секунда

void OnTimer()
  {
    Strategy.Run(); // Стартиране на логиката на стратегията  
  }

//====================================================================
Ето кода на експерта, който може да търгува по много символи едновременно:

Code: Select all

//+------------------------------------------------------------------+
//|                                                     KnestinМ.mq4 |
//|                                        Copyright 2018, Mateev SC |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Rosimir Mateev"
//#property link      ""
//#property version   "1.01"
#property strict
#property description "Стратегия на Knestin от форума Trader.bg, със следната логика:"
#property description "1. В даден час се откриват Sell и Buy позиции с фиксиран SL и TP"
#property description "3. В друг час се закриват и двете позиции, ако все още са активни"
#property description "Модификация от Mateev:"
#property description "1. Въвежда се период от време T1-T2, през който могат да се отварят позиции"
#property description "2. Въвежда се период от време T3, след който позициите трябва да се затворят"
#property description "3. Експерта търгува в паралел по много символи"

#include "Strategy.mqh" // Клас с кода на една стратегия

//====================================================================
// Параметри на стратегиите, с които търгува този експерт

#define STRATEGY_COUNT 2 // Брой на стратегиите, с които търгува този експерт

CStrategy Strategy   [STRATEGY_COUNT]; // Масив от обекти на класа CStrategy, които отработват логиката на различните стратегии
string StrategySymbol[STRATEGY_COUNT]; // Валутни двойки на стратегиите
int    StrategyMagic [STRATEGY_COUNT]; // Magic Number на стратегиите
int    StrategySL    [STRATEGY_COUNT]; // Stop Loss in Points на позициите от стратегиите
int    StrategyTP    [STRATEGY_COUNT]; // Take Profit in Points на позициите от стратегиите
double OpenHour      [STRATEGY_COUNT]; // Час на отваряне на позициите
double OpenPeriod    [STRATEGY_COUNT]; // Период за отваряне в часове (не трябва да се прехвърля в следващото денонощие)
double LivePeriod    [STRATEGY_COUNT]; // Живот на позициите в часове

//====================================================================
// Инициализация на експерта

int OnInit()
  {
    // Инициализиране на параметрите на стратегия 0
    StrategySymbol[0] = "EURUSD"; // Валутни двойки на стратегиите
    StrategyMagic [0] = 1000;     // Magic Number на стратегиите
    StrategySL    [0] =  300;     // Stop Loss in Points на позициите от стратегиите
    StrategyTP    [0] =  600;     // Take Profit in Points на позициите от стратегиите
    OpenHour      [0] = 14.0;     // Час на отваряне на позициите
    OpenPeriod    [0] =  0.5;     // Период за отваряне в часове
    LivePeriod    [0] =  5.0;     // Живот на позициите в часове
    
    // Инициализиране на параметрите на стратегия 1
    StrategySymbol[1] = "AUDUSD"; // Валутни двойки на стратегиите
    StrategyMagic [1] = 1001;     // Magic Number на стратегиите
    StrategySL    [1] = 250;      // Stop Loss in Points на позициите от стратегиите
    StrategyTP    [1] = 500;      // Take Profit in Points на позициите от стратегиите
    OpenHour      [1] = 14.0;     // Час на отваряне на позициите
    OpenPeriod    [1] =  0.5;     // Период за отваряне в часове
    LivePeriod    [1] =  5.0;     // Живот на позициите в часове    
    
    // Инициализиране на параметрите на стратегия 2, 3, 4 .... N
    // ....................................
    
    // Прехвърляне на информацията в обектите на стратегиите
    for (int i=0; i<STRATEGY_COUNT; i++)
      {
        Strategy[i].SetSymbol  (StrategySymbol[i]);
        Strategy[i].SetMagic   (StrategyMagic [i]);
        Strategy[i].SetSL      (StrategySL    [i]);
        Strategy[i].SetTP      (StrategyTP    [i]);
        Strategy[i].SetOpenHour(OpenHour      [i]);
        Strategy[i].SetOpenPeriod(OpenPeriod  [i]);
        Strategy[i].SetLivePeriod(LivePeriod  [i]);
      }
    
    // Създаване на обект на таймер с период от 1 секунда
    EventSetTimer(1); 
    return(INIT_SUCCEEDED);
  }
  
//====================================================================
// Деинициализация на експерта (изтриване на обектите в динамичната памет)

void OnDeinit(const int reason)
  {
    // Унищожаване (изтриване) на обекта на таймера
    EventKillTimer(); 
    // Тъй като обектите на двете стратегии са статични,
    // то техния деструктор се извиква автоматично при деинициализацията на експерта 
  }
  
//====================================================================
// Стартира се на всеки тик

void OnTick()
  {
    for (int i=0; i<STRATEGY_COUNT; i++) Strategy[i].Run();
  }
  
//====================================================================
// Стартира се всяка секунда

void OnTimer()
  {
    for (int i=0; i<STRATEGY_COUNT; i++) Strategy[i].Run();   
  }

//====================================================================
Трите файла ги запишете в една и съща директория (напримр в Experts/Knestin). Разгледайте кода и ако искате, можете да се опитате сами да го завършите. Слагал съм коментари в изобилие, за да може лесно да се разбере какво точно прави този код.
Олигофрена си ти
Ако някой успее да подкара на практика налудничавите неща на които казваш че били ескперти нека ми се обади за да го почерпя едно кафе.
От както се появи тука форума се напълни с идиотщини
Най-неприятното е че не може да ти се обясни нищо и къде бъркаш защото си луд и неадекватен олигофрен на когото каквото и да му кажеш все няма да го разбере

Наистина ама наистина си тотално изкукуригал и нямаш понятие от практическо програмиране
Както вече казах луд човек и олигофрен като Матеев кодове не пише
Форекса е оръжие за масово поразяване

Mateev
Posts: 463
Joined: 02 Oct 2017, 10:04
110 получени
80 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by Mateev » 10 Jun 2018, 15:39

Призив към всички свестни хора в този форум:

Ако наистина искате за в бъдеще да споделям готово написани кодове и експерти, моля да рапортувате горното мнение и да помолите администраторите на форума да го изтрият и да баннат saxteen. Аз вече го направих, но друго си е, ако го направят и много други хора.

Няма начин една тема да се развива и хората да си споделят в нея, ако някой олигофрен като saxteen си е поставил за цел непрекъснато да осира темата и да обижда всички, които се опитват да напишат нещо полезно.

User avatar
p_dim
Posts: 525
Joined: 12 Feb 2013, 17:43
107 получени
85 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by p_dim » 12 Jun 2018, 15:30

Да предупредя колегите ако не са обърнали внимание: От няколко дни вече е наличен новия билд 1845 за МТ5 и ако се свържете към демо сървър на Метакуотс, ъпдейта идва автоматично, но е още бета версия и не е официален билд. Предупреждението ми е, че код компилиран с Едитора на този билд НЕ Е съвместим с предишните билдове и няма да работи. Ако вече сте се ъпдейтнали и пишете код под новия билд, то е добра идея да се ъпдейтнат всички Терминали МТ5 които ползвате. Стар код (компилиран под по-старите билдове) ще си работи нормално и под новия.

MT5_Build_1845.png
MT5_Build_1845.png (16.08 KiB) Viewed 7640 times

User avatar
kompira
Posts: 830
Joined: 09 Jun 2010, 12:20
53 получени
9 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by kompira » 12 Jun 2018, 16:36

На MT4 винаги слагам един флаг /skipupdate в шорткът-а на метата. Не обичам който и да е софт да ми се обновява автоматично...
Но не знам дали на 5-ицата сработва това.

User avatar
p_dim
Posts: 525
Joined: 12 Feb 2013, 17:43
107 получени
85 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by p_dim » 13 Jun 2018, 15:18

Не, на МТ5 това не работи, пробвал съм. На 4-ката съм го правил, но на 5-цата изобщо не му обръща внимание на това /skipupdate. Може да има някакъв друг начин, но точно тоя не работи. 5-цата има още доста бъгове и затова аз правя обратното - гледам да се ъпдейтна към най-новата налична версия, ако ще още да е бета. Така да финтирам някой проблем който може да се яви. Ма то MQL-а си е куцо пиле и всичко трябва да се проверява ред по ред как работи, иначе не знаеш какво ще ти дойде като резултат. Наскоро четох и се смях във форума на метакуотци, един пич показва код за нещо си и там има такъв ред:

Code: Select all

char data[]; ArrayInitialize(data,0x00);
Като го питат: Що бе, 'къв е смисъла? Отговаря: Искам да съм сигурен, че няма нищо в масива... :lol: Човека вече не вярва, че новосъздаден масив е празен и допуска, че може вътре да има "нещо", дето да му обърка сметките. Те така...

User avatar
p_dim
Posts: 525
Joined: 12 Feb 2013, 17:43
107 получени
85 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by p_dim » 13 Jun 2018, 16:05

Ето ти пример що е то MQL. Делиш две цели числа и резултата го искаш в реално число, защото и на децата им е ясно, че шанса да се разделят без остатък е много малък. Това може да се случи само когато едното е кратно на другото. Пишеш в MQL-а:

Code: Select all


int a = 546; int b = 123;
double x = a/b; Print("x=",x);
Мислиш, че е резултата е 4.4390243903? Тцъ. Резултата е 4.0 и цялата дробна част е изядена. Даже изрично да му кажеш, че искаш резултата да е реално число

Code: Select all

double x = double(a/b);
с нищо не променя нещата. Та начина да разделиш две цели числа с остатък е първо да преобразуваш поне едното в реално число и тогава вече резултата е верен:

Code: Select all

int a = 546; int b = 123;
double c = (double)b;
double x = a/c; Print("x=",x);
Като проспиш тоя момент и после има да се маеш защо кода не работи както трябва. При Питон-я няма как да се случи такова нещо и не е нужно първо да нагласяш типовете променливи, за да направиш една проста операция като делене на две цели числа.

User avatar
saxsten
Posts: 1389
Joined: 04 Apr 2010, 23:16
12 получени
6 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by saxsten » 13 Jun 2018, 16:34

Mateev wrote:
10 Jun 2018, 15:39
Призив към всички свестни хора в този форум:

Ако наистина искате за в бъдеще да споделям готово написани кодове и експерти, моля да рапортувате горното мнение и да помолите администраторите на форума да го изтрият и да баннат saxteen. Аз вече го направих, но друго си е, ако го направят и много други хора.

Няма начин една тема да се развива и хората да си споделят в нея, ако някой олигофрен като saxteen си е поставил за цел непрекъснато да осира темата и да обижда всички, които се опитват да напишат нещо полезно.
Олигофрена си ти
Я покажи един StrategyTester.htm тест на тия твои така наречени "роботи "за да признаем ,че не си идиот
Накакал си едно лайно "Strategy.mqh" и с него напълно си се омазал
Прочее такова нещо като "Strategy.mqh" е изобщо ненужно при решаването на толкова проста задачка като това роботче ,ама не, непременно трябва да се осереш и то без да свършиш работа Типичното поведение на олигофрена :smile:
Форекса е оръжие за масово поразяване

User avatar
saxsten
Posts: 1389
Joined: 04 Apr 2010, 23:16
12 получени
6 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by saxsten » 13 Jun 2018, 18:44

knestin wrote:
27 May 2018, 19:32
Здравейте колеги трейдъри.
Искам да ви помоля за помощ за написване на следната програмка за МТ4 / за тестване и ЕА / :
1. В 14.00 Бг време откриваме sell EURUSD & buy EURUSD със SL= 30 и TP = 60 pipsa /по 4 знака/
2. В 14,00 Бг време откриваме sell AUDUSD & buy AUDUSD със SL = 25 и TP = 50 pipsa.

Всички сделки закриваме в 19.00 Бг време.

Така за всеки ден.

Благодаря.
Здравей knestin
Направих ти експертчето
За съжаление така както го искаш не ще да печели
Ето защо му сложих един допълнителен параметър
Когато този параметър е Mode=false; съветника работи така както ти е по задание,всеки ден отваря и затваря две насрещни сделки ,два пъти повече сделки отколкото са дните в месеца
Когато този параметър е Mode=true; робота затваря по стоп лос или по тейк профит но съотвено сделките са по малко от дните.
Значи поставяш го на графиката "EURUSD" и му настройваш стоповете тейк профити ,часове на старт и часове на за затваряне и избираш по какъв режим Mode ще работи
Същото върху графиката на "AUDUSD"
Магика робота сам си го сменя
Съжалявам че не е с открит код но докато в тоя форум свободно се разхождат луди кодеро_описвачи които дават акъл за неща от което си нямат понятие ,така ще е
Успех !
Attachments
! Knestin.ex4
(10.4 KiB) Downloaded 183 times
Форекса е оръжие за масово поразяване

Марио Димитров
Posts: 1994
Joined: 10 Aug 2010, 18:08
5 получени
3 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by Марио Димитров » 13 Jun 2018, 18:52

p_dim wrote:
13 Jun 2018, 16:05
Ето ти пример що е то MQL. Делиш две цели числа и резултата го искаш в реално число, защото и на децата им е ясно, че шанса да се разделят без остатък е много малък. Това може да се случи само когато едното е кратно на другото. Пишеш в MQL-а:

Code: Select all


int a = 546; int b = 123;
double x = a/b; Print("x=",x);
Мислиш, че е резултата е 4.4390243903? Тцъ. Резултата е 4.0 и цялата дробна част е изядена. Даже изрично да му кажеш, че искаш резултата да е реално число

Code: Select all

double x = double(a/b);
с нищо не променя нещата. Та начина да разделиш две цели числа с остатък е първо да преобразуваш поне едното в реално число и тогава вече резултата е верен:

Code: Select all

int a = 546; int b = 123;
double c = (double)b;
double x = a/c; Print("x=",x);
Като проспиш тоя момент и после има да се маеш защо кода не работи както трябва. При Питон-я няма как да се случи такова нещо и не е нужно първо да нагласяш типовете променливи, за да направиш една проста операция като делене на две цели числа.
Пробвай така:

Code: Select all

int a = 546; int b = 123;
double c = (double)b;
double x = a/c; Print("x=",DoubleToStr(x,10);
Търгувайте това, което виждате на графиките

Mateev
Posts: 463
Joined: 02 Oct 2017, 10:04
110 получени
80 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by Mateev » 13 Jun 2018, 22:45

Компилатора на MQL смята по правилния начин. Неправилно е само очакването на програмиста, че когато напише грешен код, компилатора е длъжен да хвърля боб и да познае какъв е бил истинския замисъл.

Когато се делят цели числа, винаги се използва целочислено делене със загуба на остатъка. И това е правилния начин. Присвояването на резултата на double променлива вече си е съвсем друга операция, която няма нищо общо с това какво делене се е използвало вътре в израза. Този израз може да е много сложен и вътре в него да има десетки явни или неявни преобразувания от един тип към друг, и никъде, ама наистина никъде не е казано, че всички операции вътре в израза се извършват само с типа на променливата, към която ще се присвоява, и с никакъв друг тип. Ако някой програмист наистина си го мисли това, значи дълбоко се самозаблуждава. В нито един език за програмиране няма такова правило, че всички операции в един израз се извършват само с един тип. и е близко до ума, че такова едно правило само би ограничило свободата на програмиста сам да си прави произволни преобразувания на типове вътре в израза.

Така че специално в посочения по-горе пример няма никаква грешка в MQL. Сметнал си го е точно така, както е написано, и е правилно, че вътре в израза компилатора е решил да използва целочислено делене. Ако програмиста е искал в израза да се използва делене на реални числа, трябваше да напише x = double(a)/b.

Ето вижте какво огромно количество от преобразувания са възможни между типа на променливите вътре в един израз, както и какъв кастинг се прави по подразбиране, ако програмиста не го е указал по явен начин, но математическата операция го изисква:
https://www.mql5.com/en/docs/basis/types/casting
В тази страничка е описан и горния пример, така че някой трябва първо да прочете Help-а, преди да обвини MQL, че смята грешно.

vgc
Posts: 1475
Joined: 10 Dec 2009, 10:18
44 получени
6 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by vgc » 13 Jun 2018, 23:28

Metaquotes направиха огромна грешка с анонса и опита за налагане на MQL5-цата. Тя и до ден днешен е мразена от пишещите експерти защото няма как един език от ниско ниво какъвто е C++ да бъде предлаган на хора които не са мазохистично настроени или пък неизпитващи екстаз от писането на драйвери :smile:
Ако не съм разбран правилно, то да поясня че добрият стар MQL4 беше хубав линеен функционално ориентиран език, който беше и лесно разбираем от мислещите причинно-следствено хора. Новият MQL5 е безобразно сложен обектно ориентиран език, което в съчетание с абсолютно нечитабилният С++ синтаксис няма никакъв шанс да се хареса на широката публика.
Най-ужасното в цялата работа е, че смениха компилатора в четворката с недоразумението наречено компилатор на петицата с което размазаха и MQL4-ката - на мен лично ми писна с всеки нов билд да ловя поредното малоумно хрумване на руснаците къде е избило и защо ...
Форексът е полезен като ХОБИ

User avatar
p_dim
Posts: 525
Joined: 12 Feb 2013, 17:43
107 получени
85 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by p_dim » 14 Jun 2018, 00:12

@Марио Димитров,
Мерси Марио, знам го това, аз като "разследвам" нещо винаги така си принтвам променливите до 8-мия или 10-тия знак.

@Mateev,
Аз никъде не съм написал, че компилатора не изчислява правилно. По смисъл съм написал, че не е интуитивно и затова трябва да пишеш код винаги със Хелп-а в ръка. Съвсем ясно съм написал, че за конкретния случай е много лесно да проспиш преобразуването и от там нататък всички изчисления вече ще са грешни. А точно в тоя случай компилатора няма да те предупреди за възможна загуба на данни. Като не вярваш, пробвай да видиш. Аз лично много добре знам как да го напиша кода, но хич не са така нещата с широката публика. Затова дадох точно тоя пример, защото най-често се бърка и пак повтарям: компилатора няма да те предупреди!
А за това как е при други езици, по-добре не коментирай неща от които очевидно нищо не разбираш. Ето ти пример как е при Питоня:

Python_division.png
Python_division.png (15.93 KiB) Viewed 7548 times
Я виж колко е 17/3 и какво пише: Division (/) always return a float :shock: Ма как тъй? Пък си е даже интуитивно...ако искаш само цялата част, чак тогава трябва изрично да му кажеш с две наклонени черти.
Благодаря за вниманието!

Mateev
Posts: 463
Joined: 02 Oct 2017, 10:04
110 получени
80 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by Mateev » 14 Jun 2018, 09:01

Спорен е въпроса кое от двете е по-интуитивно. Разни хора - разни "интуиции" ..... :grin:
За мене лично MQL-а си е много интуитивен, а "най-интуитивно" е човек винаги да си връзва гащите именно поради подобен тип проблеми. Аз лично нищо не оставям на кастванията по подразбиране. Винаги си ги каствам сам, за да съм сигурен, че компилатора ме е разбрал правилно какво точно си мисля.

Понеже едно време когато бях млад програмирах предимно на езици от ниско ниво (Асемблер), от тогава ми е останало мисленето на ниво битове и байтове. От тогава насам при програмиране на високо ниво ясно си представям вътрешната структура на самите променливи, и това ми помага да съм наясно какво точно се случва с тях и с обработката им в регистрите на процесора. Позволява ми и да правя сравнително невероятни каствания, като например структури към променливи и обратно или масиви към променливи и обратно. В много случаи това облегчава писането на код и го прави по-разбираем (поне за мене). Доскоро MQL езика не го позволяваше това, но сега вече има частична възможност за такива побайтови каствания. Също така аз масово използвам побитови операции или например местене на битовете наляво-надясно, като тези операции в някои случай са по-разбираеми от стандартните целочислени операции.

Имайки такова едно мислене на битово/байтово ниво, човек никога няма да обърка такива елементарни неща, свързани с математическите операции вътре в изразите и с очакванията какво точно ще се случи при тяхното изчисляване.

Колкото до начинаещите програмисти - няма как един език от високо ниво да се съобразява с тяхното незнание. Езика си следва своята вътрешна логика и обвързаност, и ако човек иска да се научи да програмира на него, трябва внимателно да изчете неговите хелпове. Така че твоето твърдение, че даден език не е "интуитивен" за някои хора, граничи с егоизъм. Откъде реши, че езика трябва да се съобразява с "интуицията" на някой си, който го мързи да чете хелпове?

Това с Piton-а, че за целочислено деление се използва не една, а две наклонени чертички, е просто част от синтакса на езика, и един програмист на Piton е длъжен да го знае това. Не може обаче този програмист да има претенции, че и всички други езици трябва да го правят по същия начин, и ако не го направят, няма да е "интуитивно".

Mateev
Posts: 463
Joined: 02 Oct 2017, 10:04
110 получени
80 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by Mateev » 14 Jun 2018, 09:34

vgc wrote:
13 Jun 2018, 23:28
Metaquotes направиха огромна грешка с анонса и опита за налагане на MQL5-цата. Тя и до ден днешен е мразена от пишещите експерти защото няма как един език от ниско ниво какъвто е C++ да бъде предлаган на хора които не са мазохистично настроени или пък неизпитващи екстаз от писането на драйвери :smile:
Ако не съм разбран правилно, то да поясня че добрият стар MQL4 беше хубав линеен функционално ориентиран език, който беше и лесно разбираем от мислещите причинно-следствено хора. Новият MQL5 е безобразно сложен обектно ориентиран език, което в съчетание с абсолютно нечитабилният С++ синтаксис няма никакъв шанс да се хареса на широката публика.
Най-ужасното в цялата работа е, че смениха компилатора в четворката с недоразумението наречено компилатор на петицата с което размазаха и MQL4-ката - на мен лично ми писна с всеки нов билд да ловя поредното малоумно хрумване на руснаците къде е избило и защо ...
MQL4 имаше огромен проблем с първоначално наложеното от него функционално/структурно програниране. С такова едно програмиране няма как да се напишат програми с висока сложност. След това с голямо закъснение от няколко години въведоха и възможност за обектно-ориентирано програмиране, както и смениха интерпретатора с компилатор. Това беше с ранг на революция, но за съжаление докато тя се случи, потребителите вече бяха написали милиони редове код, който хич не им се искаше да го изхвърлят на боклука.

Към днешна дата както MQL4, така и MQL5 позволяват едновременно да се използва както структурно, така и обектно-ориентирано програмиране. Така че всеки един програмист може да избира кое да ползва. Начинаещите обикновено избират структурно/функционално програмиране, защото е по-близко до все още неоформеното им логическо мислене. Когато обаче кода им започне да става много сложен, и започнат да се наплитат като пиле в кълчища с хиляди имена на променливи или функции, искат или не трябва да се преориентират към обектно-ориентирано програмиране. Тази крачка е сравнително трудна, но всеки един програмист в еволюцията си рано или късно стига до нея. И след като я направи тази крачка, чак тогава осъзнава, че си е губил времето, мъчейки се да програмира по стария начин.

Тази крачка аз я направих още преди 15-20 години. Тогава все още масово се програмираше на Pascal (Borland Delphi). Писането на обекти тогава си беше жива мъка, защото програмиста сам трябваше да се грижи за всички инициализации и деинициализации в конструктора и деструктора на обектите. Като цяло в 50% от времето той се бореше с управлението на паметта и с Memory Leak-овете в резултат на бъгове в това управление. Въпреки това обектно-ориентираното програмиране позволяваше да се пишат сложни софтуери, които няма как да се напишат със структурно програмиране.

Следващата революция в програмирането беше появата на DOT.NET и C#, които направиха революция в управлението на динамичната памет, изоставяйки старата концепция за Heap, и преминавайки към нова с Garbage Collector и Managed Objects. MQL4 и MQL5 ги поддържат тези неща, и като такива можем спокойно да кажем, че имат всички харакеристики на един съвременен модерен език за програмиране.

Колкото до разликата между MQL4 и MQL5 - тя беше продиктувана от нуждата от преход от 32-битова към 64-битова организация на вътрешната структура на програмите. Разликата между двете наистина е огромна и нито един софтуерен продукт по света досега не е успял да направи съвместимост на едното с другото. Всички софтуери по света когато преминават към 64-битова организация, започват да пишат кода си едва ли не от самото начало, и генерираните след това приложения също са различни - 32-битови и 64-битови. Така че не можем да се сърдим на появата на 64-битовия MQL5, както и не можем да искаме от него 100%-ова обратна съвместимост с 32-битовия MQL4. Това просто е невъзможно.

В заключение ще кажа, че според мене няма какво повече да се желае от MQL4 и MQL5 като езици, освен това, че наистина има бъгове в количества, по-големи от нормалното. Когато обаче кода е написан по правилния начин, детектирането, локализирането и заобикалянето на тези бъгове става бързо и лесно. На практика аз не съм имал ситуация, в която някакъв нов бъг да е повредил логиката на стар вече написан софтуер.

Mateev
Posts: 463
Joined: 02 Oct 2017, 10:04
110 получени
80 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by Mateev » 14 Jun 2018, 10:16

Между другото е възможно един експерт да се напише така, щото кода да може да се компилира както под MQL4, така и под MQL5. По принцип 90% от кода си е съвместим, и двата компилатора го приемт и компилират, а там където има някакви проблеми се използват директиви, указващи кода след тях за кой от двата компилатора е предназначен. И след това се пишат два комплекта код, по един за всеки компилатор.

Това става много лесно, ако се използва обектно-ориентирано програмиране. Тези хватки се правят на ниво обект, и веднъж направени, след това се скриват и стават невидими за по-високите слоеве на програмата. Програмирайки в по-високите нива човек вече забравя за кой от двата компилатора пише код, защото всичките несъвместимости вече са разрешени в ниските нива, и програмиста забравя за тях.

Самата методология на писане на класове е следната:
1. Даден клас се пише с единия от двата компилатора.
2. След като се завърши и дебъгне, се пробва да се компилира с другия компилатор.
3. Ако възникне проблем се търси разрешение, например с кастване на променливи.
4. Ако проблема не може да се разреши, тогава за дадения метод се пишат два комплекта различни кодове - един за MQL4 и един за MQL5.

Аз от около година време преобразувам стари кодове за MQL4 така, щото да се компилират и под MQL5. Ами трябва да ви кажа, че се получава сравнително бързо и лесно. При всички случаи ремонта на един стар клас става много по-бързо отколкото алтернативата да се пише от самото начало.

С две думи - съвместимоста и прехода от MQL4 към MQL5 винаги е възможен с полагането на малко повече труд. Обратната съвместимост обаче невинаги е възможна. MQL5 има функционалности, които е невъзможно да се реализират с MQL4. Например да си поискаш от сървъра липсващи барове, което е възможно при MQL5, но посмъртно няма как да се направи с MQL4.

vgc
Posts: 1475
Joined: 10 Dec 2009, 10:18
44 получени
6 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by vgc » 14 Jun 2018, 11:10

Mateev wrote:
14 Jun 2018, 09:34
MQL4 имаше огромен проблем с първоначално наложеното от него функционално/структурно програниране. С такова едно програмиране няма как да се напишат програми с висока сложност...
Това не беше огромен проблем, а беше огромен плюс. 99.9 процента от хората обръщащи поглед към възможността за автоматичен трейдинг желаят да получат реализация на чисто линейна собсвена логика, а не на някакви супер сложни алгоритми изискващи ООП.
Хората пък владеещи професионално програмиране за какъв чеп им е да се гърчат с недодяланото IDE на Матакуотес, вместо да си вземат любимото средство за разработка, да си сглобят собствен приложен сървър за взимане на търговски решения, а от страна на MT4/5 или която и да е друга търговска платформа да стои по един семпъл няколкоредов код изпълняващ безпрекословно команди от сорта на купи/продай/изчакай?

п.п. За да не съм голословен, си отварям архивите и изнамирам един от най-сложните експерти които съм писал напълно безплатно за колега трейдър (бройката на стратегиите които са ми минали по този параграф през ръцета са нещо между 300-500). Та въпросната търговска логика ми е коствала "цели" 22 килобайта код барабар с коментарите, което са има-няма 400 реда чисто линейна MQL4 логика - същото отново линейно, но под петицата ще ми коства 50% увеличение на сорса - къде отиде идеята за RAD, къде отиде идеята за прегледност или за улеснение на пишещите код. А и за какво са му на човек класове в случая - ами не му трябват и туй то и пак подчертавам че това е една от най-сложните и завършени търговски стратегии които съм виждал.
Last edited by vgc on 14 Jun 2018, 11:27, edited 4 times in total.
Форексът е полезен като ХОБИ

User avatar
saxsten
Posts: 1389
Joined: 04 Apr 2010, 23:16
12 получени
6 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by saxsten » 14 Jun 2018, 11:15

vgc wrote:
13 Jun 2018, 23:28
Metaquotes направиха огромна грешка с анонса и опита за налагане на MQL5-цата. Тя и до ден днешен е мразена от пишещите експерти защото няма как един език от ниско ниво какъвто е C++ да бъде предлаган на хора които не са мазохистично настроени или пък неизпитващи екстаз от писането на драйвери :smile:
Ако не съм разбран правилно, то да поясня че добрият стар MQL4 беше хубав линеен функционално ориентиран език, който беше и лесно разбираем от мислещите причинно-следствено хора. Новият MQL5 е безобразно сложен обектно ориентиран език, което в съчетание с абсолютно нечитабилният С++ синтаксис няма никакъв шанс да се хареса на широката публика.
Най-ужасното в цялата работа е, че смениха компилатора в четворката с недоразумението наречено компилатор на петицата с което размазаха и MQL4-ката - на мен лично ми писна с всеки нов билд да ловя поредното малоумно хрумване на руснаците къде е избило и защо ...
Споко бре VGC
Аз комай ще му намеря чалъма
Наскоро с един приятел който профи програмист и е руснак преведохме един мой шаблон от МТ4 на МТ5.
Работата общо взето се подкрепя от два инклудника единият от които привеждна ордерната с-ма на МТ5 във вид подобен на МТ4 а другият за любимите ми
double high = High; double low = Low; double open = Open; double close = Close;

и другите
iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ",
iHigh("USDCHF",PERIOD_H1,0),", ", iLow("USDCHF",PERIOD_H1,0),", ",
iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));

И понеже функциите из този щаблон са двуцифрено число сега ми остава да намеря време да ги проверя една по една дали действат ефективно но и това ще стане
Дай Боже!
Надявам се да излеза и на пазара с експерти на МТ5 макар че той доста по беден от пазара на експертите с код МТ4 но все таки
Форекса е оръжие за масово поразяване

vgc
Posts: 1475
Joined: 10 Dec 2009, 10:18
44 получени
6 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by vgc » 14 Jun 2018, 11:32

saxsten wrote:
14 Jun 2018, 11:15
Аз комай ще му намеря чалъма
Наскоро с един приятел който профи програмист и е руснак преведохме един мой шаблон от МТ4 на МТ5.
Недей да си чупиш главата с глупости, запази си реализираната логика под MQL4 - даже ако искаш си я пусни да търгува на МТ4-ка, а под тъпата петица или използвай някой синхронизиращ сделките готов софтуер или ти си го напиши като минеш например през пайпове.
В петицата например изключително много ме "кефи" възможността да налетиш на брокер който изпълнява само частично ордери. Ти му кажеш купи един лот - брокерският сървер пък ти отговаря - "чудесно имаш вече позиция от цели 0.02 лота", ама ще държа активна и останалата част от поръчката ти и по някое време ако ми хареса цената може и да ти добавя и още някое микролотче, даже и след като си затворил въпросните първи 0.02 лота - ходи превеждай после код от 4-ката на 5-цата освен ако не си настроен мазохистично ...

п.п. Визирам пръкващите се напоследък брокита на петицата които забраняват възможността за разпореждане на "Fill Or Kill" https://www.mql5.com/en/docs/constants/ ... pe_filling
Форексът е полезен като ХОБИ

User avatar
saxsten
Posts: 1389
Joined: 04 Apr 2010, 23:16
12 получени
6 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by saxsten » 14 Jun 2018, 11:56

vgc wrote:
14 Jun 2018, 11:32
saxsten wrote:
14 Jun 2018, 11:15
Аз комай ще му намеря чалъма
Наскоро с един приятел който профи програмист и е руснак преведохме един мой шаблон от МТ4 на МТ5.
Недей да си чупиш главата с глупости, запази си реализираната логика под MQL4 - даже ако искаш си я пусни да търгува на МТ4-ка, а под тъпата петица или използвай някой синхронизиращ сделките готов софтуер или ти си го напиши като минеш например през пайпове.
В петицата например изключително много ме "кефи" възможността да налетиш на брокер който изпълнява само частично ордери. Ти му кажеш купи един лот - брокерският сървер пък ти отговаря - "чудесно имаш вече позиция от цели 0.02 лота", ама ще държа активна и останалата част от поръчката ти и по някое време ако ми хареса цената може и да ти добавя и още някое микролотче, даже и след като си затворил въпросните първи 0.02 лота ...

п.п. Визирам пръкващите се напоследък брокита на петицата които забраняват възможността за разпореждане на "Fill Or Cancel" https://www.mql5.com/en/docs/constants/ ... pe_filling
Ами че аз нали точно за това го правя За да мога да си използувам реализираните под МТ4 логики без много изменения и под МТ5
По принцип само за сметки с включен Хедж под Мт5
Съгласен съм че по гадно и подло нещо от платформата МТ5 и езика към нея трудно ще се намери
Те там супер прогримистите начело с Рош сякаш нарочно се чудят каква мръсотия да измислят и как да затруднят клиента за да угодят на брокито

Изобщо няма да използувам ENUM_ORDER_TYPE_FILLING и ще го заобикалям от далеч :grin: :grin: :grin:
Форекса е оръжие за масово поразяване

User avatar
p_dim
Posts: 525
Joined: 12 Feb 2013, 17:43
107 получени
85 дадени

Re: ЕА, скриптове, индикатори и т.н. с ОТВОРЕН КОД

Post by p_dim » 14 Jun 2018, 12:07

@saxsten,
В тоя последен билд за който писах, вече ги има вградени тия функции под натиска на общественото мнение. Дал съм линка по-горе когато предупредих за бъдещите несъвместимости.

Code: Select all

3. MQL5: Добавлены функции iTime, iOpen, iHigh, iLow, iClose, iVolume, iBars, iBarShift, iLowest, iHighest, iRealVolume, iTickVolume, iSpread. Эти функции аналогичны используемым в MQL4. Таким образом, пользователям будет проще переносить код торговых программ в платформу пятого поколения.

Ранее большинство задач, решаемых этими функциями, можно было легко выполнить при помощи функций Copy*. Однако для поиска максимальных/минимальных значений на графике и поиска баров по времени пользователю требовалось реализовывать собственные функции. Теперь это можно легко выполнить функциями iHighest, iLowest и iBarShift.
Иначе съм на мнението на vgc, не се занимавай с глупости. По-добре препиши всичко което ти трябва от MQL4 на MQL5, от тоя билд нататък ще е лесно както виждаш пък и ще си сигурен че всичко работи.

Post Reply

Return to “FOREX СИГНАЛИ, СИСТЕМИ И СТРАТЕГИИ”

Who is online

Users browsing this forum: No registered users and 1 guest