Несколько месяцев назад в одном из топиков в «Столе заказов 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/
Комментарии (5)
2 rollout Сообщений: 22
35 AM2 Автор Сообщений: 16303 - Андрей
10 Nadejda-stav Сообщений: 157
35 AM2 Автор Сообщений: 16303 - Андрей
45 Bishop Сообщений: 5803 - АЛЬФАХАМЕЦ-Машковод
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий