//+------------------------------------------------------------------+
//| 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;
}
//+------------------------------------------------------------------+
www.opentraders.ru/downloads/790/
AM2