AM2
Андрей

 
Уровень 35

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 280



Делаем простейший копировщик сделок

Несколько месяцев назад в одном из топиков в «Столе заказов MQL»: zakaz.opentraders.ru/31339.html
меня просили создать копировщик сделок, но на тот момент я не представлял как это делается. В этом же топике я спросил насколько это сложно и получил ответ:

Александр, есть где то исходники копировщика? Насколько сложно написать его с нуля? Хочу сделать свою основу.

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


Тогда я сделал наброски, которые пригодились мне сегодня, когда идея окончательно созрела.

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

Первым делом откроем любую позицию в терминале и установим стопы:



Реализуем нашу идею в виде двух экспертов. Первый будет считывать параметры открытой позиции и записывать их в файл, а второй считывать данные и открывать позиции. Записывающий советник назовем «Export», а считывающий «Import».

Начнем с записывающего. Функция записи в файл будет выглядеть следующим образом:


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Log(string s="")
  {
//--- Открываем файл 
   int h=FileOpen("Copy.txt",FILE_READ|FILE_WRITE|FILE_TXT);
   FileWrite(h,s);
   FileClose(h); // закрываем файл 
  }


А считывание параметров позиции осуществим так:


   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               type=0;
               lot=OrderLots();
               sl=OrderStopLoss();
               tp=OrderTakeProfit();
              }
            if(OrderType()==OP_SELL)
              {
               type=0;
               lot=OrderLots();
               sl=OrderStopLoss();
               tp=OrderTakeProfit();
              }
           }
        }
     }


И вот наш экспорт уже готов и пишет в файл требуемые данные:


//+------------------------------------------------------------------+
//|                                                       Export.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

int type=0;
double lot=0,sl=0,tp=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Log(string s="")
  {
//--- Открываем файл 
   int h=FileOpen("Copy.txt",FILE_READ|FILE_WRITE|FILE_TXT);
   FileWrite(h,s);
   FileClose(h); // закрываем файл 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               type=0;
               lot=OrderLots();
               sl=OrderStopLoss();
               tp=OrderTakeProfit();
              }
            if(OrderType()==OP_SELL)
              {
               type=0;
               lot=OrderLots();
               sl=OrderStopLoss();
               tp=OrderTakeProfit();
              }
           }
        }
     }

   sl=NormalizeDouble(sl,Digits);
   tp=NormalizeDouble(tp,Digits);
   Log(Symbol()+" "+(string)type+" "+(string)sl+" "+(string)tp+" "+(string)lot);

   Comment("\n Order Type: ",type,
           "\n Order Lots: ",lot,
           "\n StopLoss: ",sl,
           "\n TakeProfit: ",tp);
  }
//+------------------------------------------------------------------+





Текстовый файл содержит следующую информацию:

1. Наименование инструмента.
2. Направление позиции.
3. Уровень стоплосса позиции.
4. Уровень тейкпрофита позиции.
5. Торговый объем позиции.



Считывание информации в эксперте «Import» также не составит особого труда:


//--- Открываем файл 
   int h=FileOpen("Copy.txt",FILE_READ|FILE_TXT);
   s=FileReadString(h,100);
   symb=StringSubstr(s,0,6);
   type=(int)StringSubstr(s,7,1);
   sl=(double)StringSubstr(s,9,7);
   tp=(double)StringSubstr(s,17,7);
   lot=(double)StringSubstr(s,25,3);

   FileClose(h); // закрываем файл 


Добавим открытие позиции:


//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+
void PutOrder(int types,double price)
  {
   int r=0;
   color clr=Green;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   sl=NormalizeDouble(sl,Digits);
   tp=NormalizeDouble(tp,Digits);

   r=OrderSend(symb,type,lot,NormalizeDouble(price,Digits),100,sl,tp,"",0,0,clr);
   return;
  }
//+------------------------------------------------------------------+


И готов импорт:


//+------------------------------------------------------------------+
//|                                                       Import.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

int type=0;
string s="",symb="";
double lot=0,sl=0,tp=0,pr=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+
void PutOrder(int types,double price)
  {
   int r=0;
   color clr=Green;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   sl=NormalizeDouble(sl,Digits);
   tp=NormalizeDouble(tp,Digits);

   r=OrderSend(symb,type,lot,NormalizeDouble(price,Digits),100,sl,tp,"",0,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Открываем файл 
   int h=FileOpen("Copy.txt",FILE_READ|FILE_TXT);
   s=FileReadString(h,100);
   symb=StringSubstr(s,0,6);
   type=(int)StringSubstr(s,7,1);
   sl=(double)StringSubstr(s,9,7);
   tp=(double)StringSubstr(s,17,7);
   lot=(double)StringSubstr(s,25,3);

   FileClose(h); // закрываем файл         

   sl=NormalizeDouble(sl,Digits);
   tp=NormalizeDouble(tp,Digits);

   if(type==0) pr=NormalizeDouble(Ask,Digits);
   if(type==1) pr=NormalizeDouble(Bid,Digits);
   
   if(OrdersTotal()<1) PutOrder(type,pr);

   Comment("\n Symbol: ",symb,
           "\n Order Type: ",type,
           "\n Order Lots: ",lot,
           "\n StopLoss: ",sl,
           "\n TakeProfit: ",tp,
           "\n s: ",s);

  }
//+------------------------------------------------------------------+



Когда нет открытой позиции в терминале, советник «Import» кроме считывания и открытия позиции выводит все параметры на экран:



Осуществление связи между терминалами реализуется с помощью символьных ссылок и этот момент подробно рассматривается в топике: mql.opentraders.ru/27577.html

Таким образом эксперт «Import» будет видеть текстовый файл, который лежит в папке терминала с экспертом «Export».

Скачать файлы можно по ссылке: www.opentraders.ru/downloads/1257/
  • +4
  • Просмотров: 16452
  • 18 июля 2016, 10:58
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Напишем свои функции для реальной торговли
Следующая запись в группе  
Парсинг страницы сайта и MQL4
16 июля 2016
21 июля 2016

Брокер для ваших роботов, 15 лет на рынке

Комментарии (5)

+
0
что то не работает(((
avatar

  2  rollout Сообщений: 22

  • 7 декабря 2016, 22:41
+
0
Связь между папками с помощью симлинков делали?
avatar

  35  AM2 Автор Сообщений: 16303 - Андрей

  • 8 декабря 2016, 07:32
+
0
как это сделать?
avatar

  10  Nadejda-stav Сообщений: 157

  • 24 октября 2017, 19:24
+
0
Символические ссылки наберите в поиске. И здесь в моем блоге есть описание.
avatar

  35  AM2 Автор Сообщений: 16303 - Андрей

  • 24 октября 2017, 19:49
+
+1
На всякий случай оставлю ссылку Создание символьных ссылок в системе Windows
avatar

  45  Bishop Сообщений: 5803 - АЛЬФАХАМЕЦ-Машковод

  • 24 октября 2017, 20:50

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий