RE. Хотелось бы потестировать системку... |
//+------------------------------------------------------------------+
//| 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;
}
//+-------------------------------------------------
18 июля 2015
|
20 июля 2015
|
Комментарии (16)
34 AM2 Сообщений: 15880 - Андрей
23 vomisin Автор Сообщений: 110
www.opentraders.ru/downloads/813/
34 AM2 Сообщений: 15880 - Андрей
23 vomisin Автор Сообщений: 110
34 AM2 Сообщений: 15880 - Андрей
www.opentraders.ru/downloads/813/
34 AM2 Сообщений: 15880 - Андрей
23 vomisin Автор Сообщений: 110
34 AM2 Сообщений: 15880 - Андрей
23 vomisin Автор Сообщений: 110
34 AM2 Сообщений: 15880 - Андрей
23 vomisin Автор Сообщений: 110
Заместо стоповых ордеров открывать рыночные ордера, так как стоповые ордера расставляются далеко от цены, цене надо с начало дойти до стопового ордера а потом еще взять профит, а это нереально.
Еще лучше было бы, если выставлять стоповые ордера по самому индикатору, скажем по максимуму и минимума прошлого дня по индикатору а не по цене. Потом эти ордера
передвигать по движению цены, в итоге получится капкан для цены, и большая вероятность взять профит
14 beton2011 Сообщений: 895
34 AM2 Сообщений: 15880 - Андрей
Скажем так, по индикатору открывается только рыночный ордер, это все
Еще добавить стоповые ордера за максимум и минимум цены или индикатора прошлого дня, и передвигать стоповые ордера по движению цены, скажем цена у нас ушла на 10 пунктов вниз, за ценой передвигается байстоп ордер на 10 пунктов.
Стоповые ордера передвигаются только к цене, получается что надо зафиксировать какой то уровень, это будет цена открытия дня, и если цена идет выше этого уровня, передвигается только селлстоп ордер, если цена уходит ниже уровня цены открытия дня, тогда передвигается байстоп ордер.
ТП и СЛ для рыночного и стоповых ордеров одинаковый.
Еще неплохо было бы добавить тралл для всех ордеров.
Все.
Редактирован: 27 июля 2015, 12:38
14 beton2011 Сообщений: 895
www.opentraders.ru/downloads/813/
34 AM2 Сообщений: 15880 - Андрей
14 beton2011 Сообщений: 895
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий