Все здравствуйте!
Как то не очень давно я обращался в «стол заказов» с просьбой к программистам запрограммировать системку
zakaz.opentraders.ru/26008.html, и даже уважаемый АМ2 создал предварительную версию
//+------------------------------------------------------------------+
//| AO.mq4 |
//| Copyright 2015, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property description "Simple expert advisor"
#include <stdlib.mqh>
//--- Inputs
extern int StopLoss = 500; //стоплосс отложенного ордера(если 0 то на предыдущий хай или лоу)
extern int TakeProfit = 500; //тейкпрофит отложенного ордера
extern int Delta = 100; //расстояние от лоу или хая
extern double Lots = 0.1; //лот
extern int Slip = 30; //проскальзывание
extern int Count = 1; //количество ордеров
extern int Magic = 123; //магик
/*
При открытии свечи устанавливается стоповый ордер на некотором расстоянии (параметр настраивается),
от хая или лоу «вчерашней» свечи. Хай или лоу зависит от стандартного индикатора АО Билла Вильямса.
Например — появилась новая свеча, гистограмма АО выше нуля,
над «вчерашним» максимумом установился бай-стоповый ордер,
со стоп-лоссом под вчерашним минимумом. Предположим цена пошла в сторону этого ордера и он сработал.
При открытии следующей свечи, если АО в плюсе, снова устанавливается бай-стоп на максимуме предыдущей свечи
со стоп-лоссом на её минимуме, и стоп-лосс первого модифицируется под это же значение.
При открытии последующих ордеров, стоп-лоссы всех предыдущих должны модифицироваться под последнее значение.
Не сработавшие ордера должны быть удалены при закрытии свечи.
Если показания АО ниже нуля, то всё наоборот — селл-стоп под вчерашним минимумом со стоп-лоссом над максимумом…
Тайм-фрейм — любой, валютная пара любая.
*/
int res,err;
double sl,tp;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
Comment("");
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountOrders()
{
int 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()>1)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades()
{
int 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)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
{
if(n<0) return(NormalizeDouble(d, Digits));
return(NormalizeDouble(d, n));
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountTrades()<=Count && CountOrders()<=Count)
{
PutOtlOrder();
}
}
//+------------------------------------------------------------------+
void PutOtlOrder()
{
double AO=iAO(NULL,0,1),price;
//--- sellstop
if(AO<0)
{
price=fND(iLow(Symbol(),PERIOD_D1,0)-Delta*Point);
if(StopLoss==0) sl=fND(iHigh(Symbol(),PERIOD_D1,1)); else sl=price+StopLoss*Point;
if(TakeProfit==0) tp=0; else tp=price-TakeProfit*Point;
res=OrderSend(Symbol(),OP_SELLSTOP,Lots,fND(price),0,fND(sl),fND(tp),"ОРДЕР SELLSTOP",Magic,TimeCurrent()+60*60*24,Red);
if(res<0)
{
err=GetLastError();
Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА SELLSTOP: ",err,"(",ErrorDescription(err),")");
} else {
RefreshRates();
}
}
//--- buystop
if(AO>0)
{
price=fND(iHigh(Symbol(),PERIOD_D1,1)+Delta*Point);
if(StopLoss==0) sl=fND(iLow(Symbol(),PERIOD_D1,1)); else sl=price-StopLoss*Point;
if(TakeProfit==0) tp=0; else tp=price+TakeProfit*Point;
res=OrderSend(Symbol(),OP_BUYSTOP,Lots,fND(price),Slip,fND(sl),fND(tp),"ОРДЕР BUYSTOP",Magic,TimeCurrent()+60*60*24,Blue);
if(res<0)
{
err=GetLastError();
Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА BUYSTOP: ",err,"(",ErrorDescription(err),")");
} else {
RefreshRates();
}
}
return;
}
//+-------------------------------------------------
Но это оказалось не совсем то что хотелось бы. К тому же, хоть идея и осталась прежней, появились новые мысли
несколько усложняющие ТЗ. Поэтому я решил написать новый топик-просьбу о создании такого автомата.
Идея прежняя:
При открытии свечи устанавливается стоповый ордер на некотором расстоянии (параметр настраивается), от хая или лоу «вчерашней» свечи. Хай или лоу зависит от стандартного индикатора АО Билла Вильямса. Например — появилась новая свеча, гистограмма АО выше нуля, (вот здесь хотелось бы немножко по-другому, а именно, не важно в положительной или отрицательной он, (АО), зоне, но если зелёный то) над «вчерашним» максимумом установился бай-стоповый ордер, со стоп-лоссом под вчерашним минимумом. Предположим цена пошла в сторону этого ордера и он сработал. При открытии следующей свечи, если АО в плюсе, (вернее зелёный) снова устанавливается бай-стоп на максимуме предыдущей свечи со стоп-лоссом на её минимуме, и стоп-лосс первого модифицируется под это же значение. При открытии последующих ордеров, стоп-лоссы всех предыдущих должны модифицироваться под последнее значение.
Не сработавшие ордера должны быть удалены при закрытии свечи.
Если показания АО ниже нуля, (красное) то всё наоборот — селл-стоп под вчерашним минимумом со стоп-лоссом над максимумом…
Тайм-фрейм — любой, валютная пара любая. Добавлю, ордеров на графике возможно много. На открытии каждой свечи, если соблюдены все условия устанавливается один ордер. Если он не сработал до открытия следующей — повинен быть удалён. Все сработавшие ордера закрываются или по общему стоп-лоссу, или при хорошем движении цены по общему тейк-профиту.
Настраиваемые параметры должны быть такие:
1) На каком расстоянии от хая или лоу должен установиться отложенный ордер при открытии очередной свечи.
2) Не устанавливать отложенный ордер если при открытии свечи уже есть сработавший ордер на расстоянии ближе N-пунктов от предполагаемого места установки отложки. Например: Этот параметр «20». Появилась на графике очередная свеча, и по правилам над хаем или под лоу должна установиться отложка, но ближе чем 20 пунктов от этого хая (или лоу) уже есть сработавший ордер.
3) Стоп-лосс.
4) Тейк-профит. Который тоже (хотелось бы) у всех «старых» ордеров должен модифицироваться под значение «нового».
5) Тралл. (необязательно)
Возможно что то будет не понятно по ТЗ, могу нарисовать в картинках.
С уважением.
З.Ы. И ещё вопрос: Нельзя ли как то «тюнинговать» АО, чтобы работал он по «Open», то есть чтобы не перерисовывался.
Комментарии (16)
35 AM2 Сообщений: 16247 - Андрей
23 vomisin Автор Сообщений: 110
www.opentraders.ru/downloads/813/
35 AM2 Сообщений: 16247 - Андрей
23 vomisin Автор Сообщений: 110
35 AM2 Сообщений: 16247 - Андрей
www.opentraders.ru/downloads/813/
35 AM2 Сообщений: 16247 - Андрей
23 vomisin Автор Сообщений: 110
35 AM2 Сообщений: 16247 - Андрей
23 vomisin Автор Сообщений: 110
35 AM2 Сообщений: 16247 - Андрей
23 vomisin Автор Сообщений: 110
Заместо стоповых ордеров открывать рыночные ордера, так как стоповые ордера расставляются далеко от цены, цене надо с начало дойти до стопового ордера а потом еще взять профит, а это нереально.
Еще лучше было бы, если выставлять стоповые ордера по самому индикатору, скажем по максимуму и минимума прошлого дня по индикатору а не по цене. Потом эти ордера
передвигать по движению цены, в итоге получится капкан для цены, и большая вероятность взять профит
14 beton2011 Сообщений: 895
35 AM2 Сообщений: 16247 - Андрей
Скажем так, по индикатору открывается только рыночный ордер, это все
Еще добавить стоповые ордера за максимум и минимум цены или индикатора прошлого дня, и передвигать стоповые ордера по движению цены, скажем цена у нас ушла на 10 пунктов вниз, за ценой передвигается байстоп ордер на 10 пунктов.
Стоповые ордера передвигаются только к цене, получается что надо зафиксировать какой то уровень, это будет цена открытия дня, и если цена идет выше этого уровня, передвигается только селлстоп ордер, если цена уходит ниже уровня цены открытия дня, тогда передвигается байстоп ордер.
ТП и СЛ для рыночного и стоповых ордеров одинаковый.
Еще неплохо было бы добавить тралл для всех ордеров.
Все.
Редактирован: 27 июля 2015, 12:38
14 beton2011 Сообщений: 895
www.opentraders.ru/downloads/813/
35 AM2 Сообщений: 16247 - Андрей
14 beton2011 Сообщений: 895
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий