English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Копирование торговли из MetaTrader 5 в MetaTrader 4

Копирование торговли из MetaTrader 5 в MetaTrader 4

MetaTrader 5Трейдинг | 29 октября 2010, 15:17
10 251 111
Mykola Demko
Mykola Demko

Введение

Не так давно многие трейдеры считали MetaTrader 5 сырой платформой, непригодной для реальной торговли, но сейчас, спустя небольшой срок, общественное мнение задается вопросом: когда же релиз на реале? Многие оценили преимущества, реализованные в MetaTrader 5. К тому же Чемпионат, проводимый компанией MetaQuotes Software Corp. подхлестнул интерес разработчиков к языку MQL5. И теперь этот интерес желает реализоваться в виде получения прибыли от реальной торговли. Сам вопрос "когда же релиз на реале?" адресован не по адресу. Его решение зависит от конкретного брокера. Именно они принимают окончательное решение о сроках перехода на новую платформу.

Что же может трейдер одиночка, предпринять в этой ситуации? Ответ очевиден, нужно использовать возможности реальной торговли предоставленные MetaTrader 4, как транзитные для MetaTrader 5. т.е. написать копировщик. Связки между двумя MetaTrader 4 не новация в сети. Теперь пришло время реализовать такую связку с MetaTrader 5.


Пролог

Для реализации идеи, заявленной в теме, нужно прояснить вопросы: "Откуда берется прибыль?" и "Как трейдер может управлять ростом прибыли?" На первый взгляд, ответы очевидны. Покупай дешевле, продавай дороже. Но давайте разложим на составляющие саму прибыль. Прибыль - это разница покупки и продажи, помноженная на ставку. То есть, у прибыли две составляющие: котировки и объем торговой позиции.

Чем трейдер может управлять? Что из этих двух составляющих торговли является рулем в его торговле? Ну, конечно же, объем торговой позиции. Ведь котировки трейдер получает от брокера, и их изменение ему не подвластно. Отсюда первый вывод: для того чтобы сделать копию торговли нужно поддерживать синхронно объемы торговых позиций.


1. Сравнение двух платформ

1.1 Различия в системе учета

Сравниваемые платформы имеют разную систему учета торговли и это должно осложнить вопросы копирования. Но не нужно забывать, что ведущим в этой связке является MetaTrader 5. А это значит, что в MetaTrader 4 нужно виртуально повторить туже самую систему учета.

Торговая позиция в MetaTrader 5 набирается из отдельных торговых приказов, что не противоречит ордерному учету, принятому в MetaTrader 4. Общий Stop Loss и Take Profit на позицию можно реализовать через установку каждому открытому ордеру одинакового Stop Loss и Take Profit. Существенные разногласия между платформами возникают лишь в вопросе о том, какой ордер закрывать в MetaTrader 4. Так как в MetaTrader 5 раздельного учета ордеров в торговой позиции не ведется, то этот вопрос может стать камнем преткновения.

1.2 Объемы торговых позиций

Рассмотрим в деталях, есть ли разница какой ордер закрывать? Не скажется ли это на прибыли? Например, имеем два ордера, открытые в разное время, и закрытые так же в разное время, но имеющие пересечения по времени жизни. То есть, попробуем в ордерной системе учета эмулировать торговую позицию.

Рассчитаем по вариантам, что произойдет с прибылью, если мы поменяем уровни закрытия ордеров местами:

тип 
объем
уровень открытия
 уровень закрытия
sell0.11.393881.38438
sell0.11.38868
1.38149

Для расчета набросаем код калькулятора:

void OnStart()
  {
   double open1=1.39388,close1=1.38438,
         open2=1.38868,close2=1.38149;
   Print("итог  ",n1(profit((open1-close1),0.1)+profit((open2-close2),0.1)));
   Print("ордер2  pp=",ns(open2-close2),"  profit=",n1(profit((open2-close2),0.1)));
   Print("ордер1  pp=",ns(open1-close1),"  profit=",n1(profit((open1-close1),0.1)));
  }
string ns(double v){return(DoubleToString(v,_Digits));}
string n1(double v){return(DoubleToString(v,1));}
double profit(double v,double lot){return(v/_Point*lot);}
Вот распринтовка калькуляции:
ордер1  pp=0.00950  profit=95.0
ордер2  pp=0.00719  profit=71.9
итог  166.9

А теперь поменяем местами значения close1 и close2.

ордер1  pp=0.01239  profit=123.9
ордер2  pp=0.00430  profit=43.0
итог  166.9

Рисунок 1. Варианты закрытия ордера

Рисунок 1. Варианты закрытия ордера

Из рисунка 1 видно, что участки AB и CD имеют в обоих вариантах объем 0.1, а участок BC объем 0.2, и это не зависит от того, объем какого ордера закрыт.

В профитах отдельных ордеров имеем разницу, однако итоговые прибыли от реализованных позиций равны. Но прошу обратить внимание читателя на то, что приведенный пример рассчитывался на равных объемах ордеров. То есть, на одних и тех же уровнях реализовано закрытие не ордера, а одинакового объема. Причем, если строго придерживаться принципа закрытия объемов, то не имеет значения, каким объемом обладает сам ордер. Если закрывающий объем будет больше ордерного, то произойдет частичное закрытие.

Отсюда главный вывод: в суммарной позиции не важно, какой ордер был закрыт, главное, чтобы закрытые объемы на заданных уровнях были равны.

1.3 Особенности копирования сделок

Из вышеописанных примеров видно, что для получения той же прибыли совсем нет необходимости транслировать сигналы, которые дает советник, написанный на MQL5. Достаточно повторять объемы торговых позиций. Хотя сразу оговорюсь, что по ряду причин, которые будут рассмотрены ниже, это не будет полностью тождественная торговля. Однако эти причины не могут быть препятствием для получения реальной прибыли с использованием прибыльной АТС, написанной на языке MQL5.

Первая причина снижения прибыли - это разница в котировках. У разных брокеров она может превышать спрэд. Дело в том, что трансляция происходит в реальном времени. И если в MetaTrader 5 советник на определенном уровне принял решение открыть позицию, то у брокера, к которому подключен MetaTrader 4, попросту может быть другая цена. При этом разночтения бывают как в худшую сторону, так и в лучшую.

Вторая причина снижения прибыли - это фактор времени. Копирование позиции происходит тогда, когда она уже появилась в MetaTrader 5, а значит, запаздывание неизбежно.

Эти две причины сводят на нет все пипсовочные стратегии. Поэтому, пока не будет реализована реальная торговля на MetaTrader 5, такие стратегии применять не получится. 

Системы, подразумевающие получение прибыли (с трейда), намного превышающие спрэд и нечувствительные к котировкам конкретного брокера, вполне могут быть запущены для получения реальной прибыли с помощью копировщика позиций.


2. Постановка задачи

  1. Связка по передаче сигналов между MetaTrader 5 и MetaTrader 4
  2. Трансляция позиций из MetaTrader 5
  3. Получение сигналов в MetaTrader 4
  4. Повторение торговых позиций в MetaTrader 4

2.1. Связка по передаче сигналов между MetaTrader 5 и MetaTrader 4

Первое, что приходит на ум - это передача сигналов через общий файл. Встает вопрос: не будут ли частые записи в файл вредить железу? Если записывать новые данные только тогда, когда произошло изменение позиции, то такие записи будут не очень частые. Не чаще, чем разработчики Windows делают изменения в файле подкачки. А это, в свою очередь, проверенная операция, не приводящая к порче железа. Запись в общий файл - приемлемая реализация не очень частых обращений. Это еще одно ограничение для пипсовочных стратегий, хотя и менее существенное, чем предыдущие ограничения.

Для связки можно использовать свойство MetaTrader 5 писать подкаталоги на любую глубину. Я не проверял утверждение "на любую", но до 10 вложений подкаталоги пишутся, это точно. А большего нам и не нужно. Можно конечно использовать DLL для организации доступа, но не пользоваться DLL, если вопрос можно решить без них, это моя принципиальная позиция. Чтобы решить вопрос без DLL, достаточно установить MetaTrader 4 в каталог \Files\ терминала MetaTrader 5 (см. особенности работы с файлами).

Таким образом, путь к общему файлу будет выглядеть так:

C:\Program Files\MetaTrader 5\MQL5\Files\MetaTrader 4\experts\files\xxx      //где xxx-название общего файла.

При таком расположении файл будет доступен как в MetaTrader 4, так и в MetaTrader 5, возможность совместного пользования файлом предусмотрена в функционале MQL5.

2.2. Трансляция позиций из MetaTrader 5

Для трансляции позиции и экономного расходования ресурсов нужна функция, которая будет отслеживать ситуацию появления/изменения/закрытия торговой позиции по всем инструментам. Выше было установлено, что для передачи торговли достаточно знать объем торговой позиции. Добавим к объему символ инструмента и уровни SL и TP.

Для отслеживания изменений нам потребуется знать прежнее состояние позиции. И в случае, если предыдущее и теперешнее состояния не равны (а значит, позиция изменилась), это нужно отобразить в файле. Также потребуется функция записи этой информации в файл. При этом файл нужно открывать так, чтобы он был доступен для одновременного пользования несколькими программами.

Чтобы не пропустить момент изменения позиции, следящая система должна быть реализована в функции OnTimer(), т.к. следить придется за всеми инструментами сразу, а тики приходят на разных символах в разное время. Также требуется передать сигнал об изменении содержимого файла.

2.3. Получение сигналов в MetaTrader 4

Требуется отслеживание сигнала обновления файла. Это можно организовать через переменную, состояние которой отслеживается для входа в зону изменения позиций. Нужна функция считывания файла с состоянием позиций. Стандартная функция, каких много, тут темных пятен быть не может.

Передача содержимого файла в массивы для расчетов. Тут потребуется синтаксический анализатор, т.е. парсер. Поскольку передаваться будут не только числа, но и символы, то удобней при передаче из MetaTrader 5, все кодировать в string. К тому же, записав все данные по одному символу, в одну текстовую строку, будет исключена возможность спутать данные.

2.4. Повторение торговых позиций в MetaTrader 4

Это самый большой набор функций. Он, в свою очередь, должен быть поделен на несколько подклассов.

  1. Сравнение виртуальных позиций;
  2. Функция выбора ордеров;
  3. Функция открытия ордеров;
  4. Функция закрытия ордеров;
  5. Функция модификации ордеров.

2.4.1. Сравнение виртуальных позиций

Сравнение виртуальных позиций требуется для того, чтобы удостоверится в том, что позиции приведены в соответствие. Функция должна подсчитывать позицию по каждому инструменту в отдельности, а также иметь возможность отфильтровывать позиции, по которым торговля запрещена (если такие имеются).

В практике может встретиться ситуация, когда у брокера нет инструмента, по которому передан сигнал из MetaTrader 5. Но это не должно блокировать торговлю в целом, хотя нужно предусмотреть предупреждение. Пользователь вправе знать о нештатной ситуации.

2.4.2. Функция выбора ордеров

Данная функция должна выбирать ордера в зависимости от символа для дальнейшей работы с ними. При этом, поскольку мы транслируем только открытые позиции, ордера также должны фильтроваться, чтобы не попались отложенные.

2.4.3. Функция открытия ордеров

Должна содержать максимальное количество расчетов. Таким образом, достаточно будет передать объем и тип.

2.4.4. Функция закрытия ордеров

Так же как и предыдущая должна все обсчитывать перед отдачей команды на закрытие.

2.4.5. Функция модификации ордеров

Функция должна содержать проверку на предмет близости к рынку. Также, желательно развести во времени выставление ордера и его стоп-уровней, т.к. совместное выставление стоп-уровней при открытии разрешено не у всех брокеров. К тому же, совместное открытие ордера и выставление стоп-уровней увеличивает вероятность реквот.

Таким образом, позиция будет максимально быстро повторена. А выставление стоп-уровней вещь уже второстепенная, хотя и не менее важная.


3. Реализация

Коды подробно комментированы, почти построчно. Поэтому в разъяснениях к кодам, я буду останавливаться лишь на самых сложных моментах.

Связка по передаче сигналов между MetaTrader 5 и MetaTrader 4

Сама связка реализована в MetaTrader 5 функцией:

void WriteFile(string folder="Translator positions") // по умолчанию стоит имя файла общего пользования

Флаги открытия означают:

FILE_WRITE|FILE_SHARE_READ|FILE_ANSI

файл открывается для записи | разрешено совместное пользование разными программами для чтения | в кодировке ansi

В MetaTrader 4 связка реализована функцией:

int READS(string files,string &s[],bool resize)

параметр resize запрещает перераспределение памяти массива получаемых данных. В коде выделение памяти под этот массив идет на каждой итерации т.к. разработчику невозможно предсказать, сколько строк будет. Это зависит от количества выбранных инструментов в MetaTrader 5. Поэтому высчитать его заранее в MetaTrader 4 не получится.

Как выход, следует увеличивать массив на каждом шаге на один. Но эту операцию следует блокировать уже на втором вызове функции, т.к. длинна массива, уже установлена, и меняться не будет. Для этого и предусмотрена переменная bool resize.

Трансляция позиций из MetaTrader 5

Для организации трансляции в функции OnTimer с частотой 1 сек. идет получение данных обо всех позициях в функции:

void get_positions()

С последующим сравнением предыдущего значения позиций, с текущим значением в функции:

bool compare_positions()

Причем выход по return(true) происходит, в случае если хоть одна ячейка не совпадает. Выход по return(true) означает, что позиции не равны, и файл нужно переписать. При перезаписи файла  счетчик перезаписи cnt_command увеличивается на один.

Получение сигналов в MetaTrader 4

После считывания файла функцией READS() имеем заполненный массив строк s[].

Для того, чтобы эти строки превратились в полезную информацию, нужен парсер.

Функция:

int parser(int Size)

является лишь оболочкой для вызова функции распознавания строки:

void parser_string(int x)

Функция ведет распознавание всех ячеек, кроме символов.

Распознавание символов ведется циклом, единожды, в начале алгоритма, с помощью функции:

void parser_string_Symbols(int x)

Далее мы не будем обращаться к коду на mql5, и рассмотрение кода переносится строго к коду mql4, если это не будет оговорено отдельно.

Сравнение виртуальных позиций

Сравнение позиций разделено на две части. Сравнение объема и типа позиций реализовано в функции:

bool compare_positions()

в этой оболочке реализован вызов получения реального состояния позиций в функции:

void real_pos_volum()

и цикл сравнения, по уже упомянутому принципу "все или нечего". То есть, если хоть одна ячейка не совпадает, все позиции признаются различными. В real_pos_volum() реализованы ряд фильтров, которые описаны подробно в самом коде и будут использоваться неоднократно в других функциях.

В частности, при суммировании объема всех ордеров по одному инструменту в одну виртуальную позицию. При этом, для того чтобы локовые позиции (если такие будут), обрабатывались правильно, ордера buy будут иметь объем с минусом, а ордера sell с плюсом.

Второй частью сравнения является сравнение стоповых уровней (под стоповыми уровнями подразумевается не только Stop Loss, но и Take Profit) реализована в функции, подобной вышеописанной:

bool compare_sl_tp_levels()
Как и с объемами, внутри оболочки следует вызов получение информации о реальном состоянии стоп-уровней в функции:
void real_pos_sl_tp_levels()

Функция выбора ордеров

Ордера следует выбирать только для закрытия объема, поэтому сложная специализированная функция выбора реализована только для закрытия:

void close_market_order(string symbol,double lot)

Имеет параметры символа и объема, который следует закрыть. Для того чтобы меньше дробить ордера, в первом цикле функции ведется поиск ордера, который равен по объему с закрывающим объемом, переданным в параметре.

Если же такого ордера нет (о чем свидетельствует состояние true, флага закрытия FlagLot), то закрывается указанный в параметре объем первого в цикле ордера (проверка на превышение объема ордера реализована в самой функции закрытия Closes()).

Выбора ордеров для модификации стоп-уровней реализован в функции:

void modification_sl_tp_levels()

Ордера фильтруются лишь по символу, т.к. все стоп-уровни, в пределах одного инструмента равны.

Функция открытия ордеров

Реализуется в функции:

int open_market_order(string symbol,int cmd,double volume,
                     int stoploss=0,int takeprofit=0,int magic=0)

содержит все требуемые проверки для комфортного открытия ордера по указанным данным.

Функция закрытия ордеров

Реализуется в функции:

bool Closes(string symbol,int ticket,double lot)

В коде имеется проверка на случай превышения lot параметра над реальным объемом выбранного ранее ордера.

Функция модификации ордеров

Реализуется в функции:

bool OrderTradeModif(int ticket,string symbol,int cmd,double price,
                    double stoploss=0,double takeprofit=0,int magic=0)

В коде имеются проверки, на случай если споп-уровни, не соответствуют типу ордера, производится обмен значениями. Так же проверяется случай, когда уровни уже имеют запрашиваемое значение.

4. Функции логики

Ранее составленный план окончен, но в коде остались не разъясненные функции. Это функции логики, можно сказать основные функции движущие сам процесс.

void processing_signals()
void processing_sl_tp_levels()

Обе функции являются бесконечным циклом с выходом по условному break. Тут нужно отметить, что сам скрипт, реализован в виде бесконечного цикла. Для того чтобы пользователь мог комфортно удалить программу, в основное условие цикла встроена функция IsStopped().

Код из советника в зацикленный скрипт переносится вот так:

 // Init()
 while(!IsStopped())
    {
     // Start()
     Sleep(1000);
    }
 // Deinit()

Вся логика скрипта описана в таком же бесконечном цикле в стандартной Функции start().

Код цикла, расположенного в start() будет выглядеть так:

     Если торговый поток не занят
          Прочесть файл и сохранить данные в массив (не изменяя размер массива);
          если в файле были изменения
               пишем новые комментарии;
               запоминаем время старта циклов проверок соответствия (расположенных ниже);
               если сравниваемые по объемам позиции не равны
                    обрабатываем позиции по объемам;
               если сравниваемые по стопам позиции не равны
                    обрабатываем позиции по стопам;
               высчитываем время окончания проверок;
          Если время не превышено
               делаем паузу на остаток времени;

Самые сложные логические построения находятся в функциях processing_signals() и processing_sl_tp_levels().

Начнем описание функций по принципу "от простого к сложному". Хотя вызов в коде идет наоборот.

//+------------------------------------------------------------------+
//| обработка стоп-уровней                                           |
//+------------------------------------------------------------------+
void processing_sl_tp_levels()
  {
//--- запомним время входа в цикл   
   int start=GetTickCount();
   while(!IsStopped())
     {
      //--- если торговый поток не занят
      if(Busy_and_Connected())
        {
         //--- выбор ордера и модификация стоп-уровней           
         modification_sl_tp_levels();
        }
      //--- если время задержки вышло, обновим информацию из файла  
      if(GetTickCount()-start>delay_time)READS("Translator positions",s,false);
      //--- если в файле счетчик обновлений изменился, выходим из цикла      
      if(cnt_command!=StrToInteger(s[0]))break;
      //--- микропауза      
      Sleep(50);
      //--- если реальные стоп-уровни и в файле равны, выходим из цикла     
      if(!compare_sl_tp_levels())break;
     }
   return;
  }

Как уже упоминалось раньше, функция представляет собой бесконечный цикл с выходом по двум условиям:

Первое условие выхода из цикла происходит в случае, если значение cnt_command не равно аналогичному значению в файле. Перед этим происходит получение последней информации о файле при условии, что время работы цикла превысило задержку, установленную в глобальной переменной delay_time.

Время может быть превышено, т.к. все модификации защищены фильтром Busy_and_Connected(). То есть входить только в случае, если торговый поток свободен.

Тут стоит объяснить, что в MetaTrader 4 (в отличие от MetaTrader 5) невозможно послать серию команд серверу, не получив реквот. Сервер может принять только первый запрос, остальные будут потеряны. Поэтому перед выставлением команды серверу следует сделать проверку, свободен ли торговый поток.

Вторая проверка на выход из цикла, это ранее уже описанная функция сравнения позиции по стоп-уровням compare_sl_tp_levels(): если позиции равны, то покидаем цикл.

Теперь к сложному: функция processing_signals() организована похожим образом, но логическая часть сильно отличается по функциональности.

Вот этот участок разберем подробно:

//--- преобразовываем направление позиции хранящейся в файле к виду -1,+1            
int TF=SymPosType[i]*2-1;
//--- преобразовываем направление реальной позиции к виду -1,+1
int TR=realSymPosType[i]*2-1;
//--- сохраняем объём позиции хранящейся в файле                     
double VF=SymPosVol[i];
//--- сохраняем объём реальной позиции 
double VR=realSymPosVol[i];
double lot;
//--- если позиции по текущему символу не равны
if(NormalizeDouble(VF*TF,8)!=NormalizeDouble(VR*TR,8))
  {
//--- если реальный объём не равен нулю и направления не равны или
//--- если направления равны и реальный объём больше чем в файле                              
   if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))
     {
      //--- если направления равны и реальный объём больше чем в файле 
      if(TF==TR && VF<VR)lot=realSymPosVol[i]-SymPosVol[i];
      //--- если реальный объём не равен нулю и направления не равны
      else lot=realSymPosVol[i];
      //--- закрываем на расчитанный объём, и выходим из цикла                  
      close_market_order(Symbols[i],lot);
      break;
     }
   else
     {
      //--- если направления равны и реальный объём меньше чем в файле 
      if(TF==TR && VF>VR)lot=SymPosVol[i]-realSymPosVol[i];
      //--- если направления не равны и реальный объём равен нулю                  
      else lot=SymPosVol[i];
      //--- открываем на расчитанный объём, и выходим из цикла 
      open_market_order(Symbols[i],SymPosType[i],lot);
      break;
     }
  }

Переменные TF,TR сохраняют значение типа позиции в виде buy=-1,sell=1. Соответственно, TF-это значение, хранящееся в файле, TR-реальное значение виртуальной позиции. Аналогично с объемами VF,VR.

Таким образом, неравенство:
if(VF*TF!=VR*TR)

будет true в случае, если не равны объемы или типы позиций.

Далее идет логическая связка:

if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))

означающая, что если реальный объем не равен нулю и типы не равны, то следует закрыть всю позицию.

Сюда входят варианты, когда объем в файле равен нулю и вариант, когда позиция перевернута по направлению. В варианте, когда позиция перевернута по направлению, следует сначала подготовить позицию к открытию, т.е. закрыть предыдущий объем. Тогда при следующей итерации, логика пойдет по другой ветке, на открытие.

Второе сложное условие логической связки означает, что если тип верный, но реальный объем больше того, что хранится в файле, то следует уменьшить реальный объем. Для этого предварительно высчитывается размер лота, на который нужно уменьшить объем.

Если же ни одно условие закрытия не подходит к данной ситуации, а позиции, как мы выяснили в первом фильтре, не равны, то следует открытие нового ордера. Здесь тоже есть два варианта: открыть ордер на весь размер позиции в файле или долиться до уже имеющихся ордеров. Тут хочу отметить, что проверка на превышение предельного объема имеется в самой функции открытия, поэтому недостающий объем (если этого не позволила проверка) будет открыт при следующей итерации алгоритма. Благодаря тому, что вначале обрабатываются ситуации закрытия, а лишь потом открытия, практически не может быть ситуации локирования.

Под конец разбора кодов хочу отметить тонкое место, над которым пришлось попотеть при разработке алгоритма. Ситуация переоткрытия ордера, который только что закрылся в MetaTrader 4 по стопам. Я уже упоминал ранее, что расхождение котировок чаще всего держится в районе 2-3 пункта пятизнака. При спрэде в 15 разница несущественная. Но при этой разница при срабатывании стоплосса или тейкпрофита в MetaTrader 4, раньше чем в MetaTrader 5, создавала ситуацию, когда алгоритм стремился воссоздать только что закрытую позицию, с последующим ее удалением, при срабатывании стопов на MetaTrader 5.

К крупным убыткам это не приводило, но зря терялся один спрэд. Поэтому алгоритм был переработан так, чтобы после удаления позиции MetaTrader 4 не восстанавливал бы ее, а ожидал, пока изменится состояние файла. И лишь потом, снова выйдет на боевое дежурство. В данной ситуации трейдер руками может удалить позицию, если посчитает ее неверной. И она не будет восстановлена, пока MetaTrader 5 не сделает изменения в файле.

Единственное слабое место - это редко встречаемая ситуация, когда стопы MetaTrader 4 удалят позицию, а в MetaTrader 5 позиция так и не будет закрыта. В таком случае могу посоветовать перезагрузить скрипт Copyist positions. И последняя оговорка, код не проверяет работу в выходные дни. Тут ничего страшно нет, кроме того, что лог будет забит никому не нужными реквотами.


5. Проверка реализации на практике

Установим MetaTrader 4 в каталог C:\Program Files\MetaTrader 5\MQL5\Files\

Запустим, скомпилированный советник Translator positions на любом чарте в MetaTrader 5  (работа советника не зависит от чарта, на котором он запущен).

 mt5_comm

Рисунок 2. Translator positions в MetaTrader 5

На экране появился многострочный комментарий, с состоянием счетчика в первой строке и логом всех позиций построчно.

Запустим скомпилированный скрипт Copyist positions на любом чарте в MetaTrader 4  (работа зацикленного скрипта не зависит от чарта, на котором он запущен). На экране появился многострочный комментарий, с состоянием счетчика в первой строке и логом всех позиций построчно.

mt4_comm

Рисунок 3. Copyist positions в MetaTrader 4

Далее можно в MetaTrader 5 запускать любой советник, результаты его работы будут максимально быстро скопированы в MetaTrader 4.

Cвязка Metatrader4 и MetaTrader5

Рисунок 4. Позиции и ордера в терминалах MetaTrader 4 (сверху) и MetaTrader 5 (снизу)

Кстати говоря, управление счетом MetaTrader 5 может осуществляться и вручную, либо счет может быть залогинен по инвест-паролю.

Так, к примеру, копировщик можно запустить на любом чемпионатном счете.


Заключение

Данная статья призвана ускорить переход трейдеров на новую платформу, и стимулировать изучение MQL5.

В заключение хочу сказать, что приведенный код не может полностью заменить прямую торговлю на реале в MetaTrader 5. Он написан как универсальный, под любую систему торговли без учета логики, поэтому, как все универсальное, неидеален. Но на основе него может быть написан транслятор сигналов под конкретную стратегию. Для многих трейдеров, не разбирающихся в программировании, он  может служить переходным этапом в ожидании релиза.

Тем же, кто хорошо разбирается в программировании, рекомендую доработать код на распознавание ордеров по магику и реализовать передачу и выставление отложенных ордеров. Выставление отложенных ордеров не влияет на получение прибыли при условии устойчивого соединения с сервером. Если же разрывы связи часты, то следует скопировать всю серверную часть, в том числе и отложенные ордера.

Изучайте новый язык, пишите на нем робастные системы. Удачи в торговле.

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (111)
Kourosh Davallou
Kourosh Davallou | 12 нояб. 2013 в 19:12
awkozlov:

You can batch file. And across the network and within the company.

By the way file synchronization for mega Maykosoftovsky recommend SyncToy 2.1 http://www.microsoft.com/en-us/download/details.aspx?id=15155

     string Path = TerminalInfoString(TERMINAL_PATH) +"\\experts\\files\\";
      if (  CopyFileA (Path+folder+".csv","c:\\"+folder+"csv", true  ))
         PrintFormat("%s file moved",folder);
      else
         PrintFormat("Error  %s ! Code  %d",Path+folder ,GetLastError());
    
Serhii Lendych
Serhii Lendych | 29 нояб. 2013 в 21:46
Urain:
Это всё теперь можно будет делать на mutex

Не могу понять как можно скопировать торговлю из одного теримнала в другой на mutex 

revers45
revers45 | 30 нояб. 2013 в 12:03
ToporMT5:

Не могу понять как можно скопировать торговлю из одного теримнала в другой на mutex 

Ну если для копирования торговли применять современные методы межпрограммного обмена, то можно и без мьютексов, а если применять древние, файловые, то без мьютексов сложно синхронизировать операции записи и чтения.
Это как с почтой - можно послать по телефону и через инет, а можно и наземным транспортом, при этом ктото должен регулировать дорожное движение.
В общем то, средства синхронизации (семафоры, мьютексы, ивенты), придуманы давно - около полувека тому назад, просто к нам в MQL, немного запоздали.
 

Subtle
Subtle | 23 дек. 2014 в 00:57

.. а что делать, если МТ4 не может открыть файл ?

пишет:  copyist_positions EURUSD,H4: Ошибка открытия файла5004

chera
chera | 17 авг. 2015 в 04:14
Добрый день. Хотел бы узнать. Тема еще жива под Windows 10 и свежие билды MT4, MT5?
Создание интерактивного советника для полуавтоматической торговли с заданным риском Создание интерактивного советника для полуавтоматической торговли с заданным риском
Некоторые трейдеры используют автоматизированные системы торговли, другие совмещают автоматическую торговлю с ручной, основанной на показаниях нескольких индикаторов. Я принадлежу ко второй группе, поэтому возникла необходимость в интерактивном инструменте для динамической оценки рисков и ценовых уровней непосредственно с графика. В данной статье мы представим способ реализации интерактивного советника для полуавтоматической торговли с заданным уровнем соотношения прибыль/риск (Reward/Risk ratio).
Владимир Цирульник: "Суть моей программы - импровизация!" (ATC 2010) Владимир Цирульник: "Суть моей программы - импровизация!" (ATC 2010)
На счету у Владимира Цирульника один из самых ярких взлетов текущего Чемпионата. К концу третьей торговой недели эксперт Владимира пришел шестым и, похоже, не собирается сдавать позиций. Алгоритм IMEX, который лежит в основе советника, был создан самим разработчиком. Чтобы узнать об этом алгоритме побольше, мы связались с Владимиром.
Александр Ануфренко: "Знал бы, где упасть - перинку бы подстелил" (ATC 2010) Александр Ануфренко: "Знал бы, где упасть - перинку бы подстелил" (ATC 2010)
Рискованная разработка Александра Ануфренко (Anufrenko321) в течение трех недель не покидала первую тройку Чемпионата. Пережив на прошлой неделе чудовищный стоп-лосс, эксперт потерял около $60 000, но сейчас вновь подбирается к лидирующим позициям. Автор этого интересного эксперта решил рассказать о принципах работы и особенностях своего детища.
Работа по Накоплению/Распределению и что из этого можно сделать Работа по Накоплению/Распределению и что из этого можно сделать
Индикатор Накопления/Распределения A/D имеет одно интересное свойство - пробитие трендовой линии, построенной на графике данного индикатора с определённой долей вероятности говорит нам о скором пробое линии тренда на графике цены. Данная статья будет полезна и интересна людям, только начинающим программировать на MQL4, поэтому я постарался изложить всё в наиболее доступной для понимания форме и использовать самые простые конструкции построения кода.