Буквально на днях ко мне обратились со следующей просьбой:
попробуй подключится к инвест паролю, там советник работает с плавающими ордерами, если подключишься посмотри алгоритм возможно сделать подобие?
MetaTrader4 Server: FXOpen-ECN Demo Server
Login: 120134192
Investor: vkl0cin
мониторинг в режиме реального времени
По мониторингу и сделкам я создал подобный эксперт:
//+------------------------------------------------------------------+
//| BabloKos.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
extern double StopLoss = 500;
extern double TakeProfit = 10;
extern int Slip = 30;
extern int Magic1 = 111;
extern int Magic2 = 222;
extern double Lots = 0.1;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,int magic)
{
int r=0;
color clr=Green;
double sl=0,tp=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}
r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу |
//+------------------------------------------------------------------+
int CountOrders(int type)
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==type) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| Подсчет позиций |
//+------------------------------------------------------------------+
int CountTrades(int ot=-1)
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==0 && (ot==0 || ot==-1)) count++;
if(OrderType()==1 && (ot==1 || ot==-1)) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ModifyOrders(int magic)
{
double all=0,tp=0,sl=0;
double count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
all+=OrderOpenPrice()*OrderLots();
count+=OrderLots();
}
}
}
}
if(count>0) all=NormalizeDouble(all/count,Digits);
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
{
if(OrderType()==OP_BUY)
{
tp=NormalizeDouble(all+TakeProfit*Point,Digits);
sl=NormalizeDouble(all-StopLoss*Point,Digits);
if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
}
if(OrderType()==OP_SELL)
{
tp=NormalizeDouble(all-TakeProfit*Point,Digits);
sl=NormalizeDouble(all+StopLoss*Point,Digits);
if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Mode()
{
bool m;
double oop=0,sl=0,tp=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==2)
{
if(Ask-TakeProfit*Point>OrderOpenPrice())
{
oop=NormalizeDouble(Ask-TakeProfit*Point,Digits);
if(StopLoss>0) sl=NormalizeDouble(oop-StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(oop+TakeProfit*Point,Digits);
if(OrderOpenPrice()!=oop) m=OrderModify(OrderTicket(),oop,sl,tp,OrderExpiration(),Lime);
}
}
if(OrderType()==3)
{
if(OrderOpenPrice()-Ask>TakeProfit*Point)
{
oop=NormalizeDouble(Ask+TakeProfit*Point,Digits);
if(StopLoss>0) sl=NormalizeDouble(oop+StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(oop-TakeProfit*Point,Digits);
if(OrderOpenPrice()!=oop) m=OrderModify(OrderTicket(),oop,sl,tp,OrderExpiration(),Lime);
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountOrders(3)<1) PutOrder(3,Bid+TakeProfit*Point,Magic1);
if(CountOrders(2)<1) PutOrder(2,Bid-TakeProfit*Point,Magic2);
if(CountOrders(0)>0) ModifyOrders(Magic2);
if(CountOrders(1)>0) ModifyOrders(Magic1);
Mode();
Comment("\n Trades: ",CountTrades());
}
//+------------------------------------------------------------------+
Который собственно и отторговал вчера на счете с такими показателями:
А вот скрин со сделок оригинала за 3 дня:
Набросок ТЗ у меня получился примерно такой:
1. На расстоянии 5п от цены таскаются лимитники.
2. У ордеров есть время истечения
3. При срабатывании серии на них накидывается общий тейк.
4. Тейк всего 10п. это все 5 знак.
5. Лось 500.
6. Если не остается ни одного лимитника, парочка ставится заново.
7. При малой волатильности не работает.
8. Если остается 1 ордер он удаляется секунд через 10.
В моем варианте открывается намного больше ордеров, т.к. по моим наблюдениям за работой эксперта автора у него используется контроль волатильности.
Заказчик дал добро выложить эксперт на всеобщее обозрение, насчет автора идеи я промолчу
Hа общее обозрение выкладывать будем?
Конечно пусть критикуют, м.б. что полезное подскажут.
он написал его для себя, просто тестит и поделился инвест паролем, говорит что советник берет данные с сайта со стакана, вот дал ссылку www.fxopen.ru/ru/instrumenty-treidera-forex/
сказал «Копай ликвидность, там суть»
А вот насчет последней цитаты, я что то сильно сомневаюсь
Сегодня я добавляю в советник контроль волатильности и также ставлю на мониторинг с предоставлением инвестпароля. Наблюдать за работой эксперта тоже само по себе увлекательное занятие
Ставлю волатильность на глазок равной 10.
MetaTrader4 Server: FXOpen-ECN Demo Server
Логин: 120134944
Инвестор: dquh7tu
Насколько хватит данной системы мне и самому интересно. Предлагайте варианты доработки, обсуждение данной системы только приветствуется.
Скачать советник можно по ссылке:
www.opentraders.ru/downloads/1393/
Комментарии (7)
19 lorik Сообщений: 357 - Лариса
10 cardon Сообщений: 376
Редактирован: 23 ноября 2016, 17:11
35 AM2 Автор Сообщений: 16430 - Андрей
можно попробовать увеличить расстояние с 5п. до 7 — 10п.
этого нет в настройках
если уменьшить количество ордеров избежим такой просадки.
также можно добавить запрещение выставление ордера при расширении спреда, чтоб он работал внутри заданного спреда только, а если спред превышен то не выставляем ордера.
также он открывает ордера и по 0,01 — 0,02 .....0,09 хотя указанный лот в советнике 0,10
возможно с вероятностью 90% его нельзя пускать в новости, ведь просто безоткатное движение в 500пп. выдает стоп 100%
мб он только для азии?))
10 cardon Сообщений: 376
Желающие могут ставить в любое время. Доработки через стол заказов.
35 AM2 Автор Сообщений: 16430 - Андрей
10 cardon Сообщений: 376
1 MetaStorm Сообщений: 1
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий