Необходим советник, который открывал бы ордера после закрытия свечи и прохождения цены в обратном направлении N пунктов.
//+------------------------------------------------------------------+
//| FractalMarket.mq4 |
//| Copyright 2016, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
//--- Inputs
extern double Lots = 0.1; // лот
extern double MaxLot = 5; // максимальный торговый объем
extern double KLot = 2; // увеличение лота
extern int StopLoss = 100; // лось
extern int TakeProfit = 900; // язь
extern int Step = 100; // расстояние от фрактала
extern int Slip = 30; // проскальзывание
extern int Shift = 2; // сдвиг баров назад
extern int Expiration = 14; // время истечения в часах
extern int Count = 100; // количество открываемых ордеров
extern int Magic = 123; // магик
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountOrders(int ord)
{
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()==ord) 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()<2) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DelOrder()
{
bool del;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()>1) del=OrderDelete(OrderTicket());
}
}
}
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int FindOrderType()
{
int oticket,ticketNumber=0,type=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
oticket=OrderTicket();
if(oticket>ticketNumber)
{
ticketNumber=oticket;
type=OrderType();
}
}
}
}
return(type);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr=Green;
double sl=0,tp=0;
datetime expiration=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);
}
if(type>1) expiration=TimeCurrent()+Expiration*3600;
r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ModifyOrders()
{
bool m;
double count=0;
double all=0,tp=0,sl=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();
}
}
}
}
all=NormalizeDouble(all/count,Digits);
for(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(OrderTakeProfit()!=tp || OrderStopLoss()!=sl) m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
}
else
if(OrderType()==OP_SELL)
{
tp=NormalizeDouble(all-TakeProfit*Point,Digits);
sl=NormalizeDouble(all+StopLoss*Point,Digits);
if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl) m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot()
{
double lot=Lots;
if(CountTrades()>0) lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
if(lot>MaxLot)lot=Lots;
return(lot);
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
double up=0,dn=0,ma=0;
int otype=FindOrderType();
//--- get ind
up=iFractals(NULL,0,MODE_UPPER,Shift);
dn=iFractals(NULL,0,MODE_LOWER,Shift);
// первый ордер
if(up>0 && CountTrades()<1)//--- sell
{
if(CountOrders(1)<1) PutOrder(1,Bid);
}
if(dn>0 && CountTrades()<1)//--- buy
{
if(CountOrders(0)<1) PutOrder(0,Ask);
}
// отложки
if(CountTrades()>0)
{
if(CountOrders(3)<1 && otype==1) PutOrder(3,Bid+Step*Point);//--- selllimit
if(CountOrders(2)<1 && otype==0) PutOrder(2,Ask-Step*Point);//--- buylimit
}
// удаление отлоги если нет поз
if(CountTrades()<1) DelOrder();
// один стоп всем позам
if(CountTrades()>1) ModifyOrders();
Comment("\n UP Fractal: ",up,
"\n DN Fractal: ",dn,
"\n Trades: ",CountTrades(),
"\n Type: ",otype);
//---
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Mult.mq4 |
//| Copyright 2015, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property strict
extern string s="Выбор валютной пары";
extern string Symbol1 = "EURUSD";
extern string Symbol2 = "GBPUSD";
extern string Symbol3 = "";
extern string Symbol4 = "";
extern string Symbol5 = "";
extern string Symbol6 = "";
extern string Symbol7 = "";
extern string Symbol8 = "";
extern string Symbol9 = "";
extern string ss="Настройки советника";
extern double Lots = 0.01; // лот
extern double MaxLot = 5; // максимальный торговый объем
extern double KLot = 2; // увеличение лота
extern int TakeProfit = 3333; // Тейк
extern int StopLoss = 3333; // Лосс
extern int Slip = 30; // Проскальзывание
extern int Magic = 123; // Магик
extern int TimeFrame = 1; // Период графика
extern string sss="Настройки индикатора ADX";
//--- input ADX parameters
extern int ADXPeriod=14; // ADX
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(Symbol1!="")TradeOnSymbol(Symbol1,Magic);
if(Symbol2!="")TradeOnSymbol(Symbol2,Magic);
if(Symbol3!="")TradeOnSymbol(Symbol3,Magic);
if(Symbol4!="")TradeOnSymbol(Symbol4,Magic);
if(Symbol5!="")TradeOnSymbol(Symbol5,Magic);
if(Symbol6!="")TradeOnSymbol(Symbol6,Magic);
if(Symbol7!="")TradeOnSymbol(Symbol7,Magic);
if(Symbol8!="")TradeOnSymbol(Symbol8,Magic);
if(Symbol9!="")TradeOnSymbol(Symbol9,Magic);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void TradeOnSymbol(string symb,int magic)
{
int ticket,total;
double bid=0,ask=0,point=0,digits=0;
double padx1=iADX(symb,TimeFrame,ADXPeriod,0,MODE_PLUSDI,1);
double padx2=iADX(symb,TimeFrame,ADXPeriod,0,MODE_PLUSDI,2);
double madx1=iADX(symb,TimeFrame,ADXPeriod,0,MODE_MINUSDI,1);
double madx2=iADX(symb,TimeFrame,ADXPeriod,0,MODE_MINUSDI,2);
total=SymbolOrdersTotal(symb,-1,Magic);
if(CountTrades(symb,Magic)<1)
{
bid = MarketInfo(symb,MODE_BID);
ask = MarketInfo(symb,MODE_ASK);
point = MarketInfo(symb,MODE_POINT);
digits= MarketInfo(symb,MODE_DIGITS);
/**/
if(padx2>madx2 && padx1<madx1)
{
ticket=OrderSend(symb,OP_BUY,Lot(symb,Magic),ask,Slip,ask-StopLoss*point,ask+TakeProfit*point,"",Magic,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()," as ",symb);
}
else Print("Error opening BUY order : ",GetLastError()," as ",symb);
return;
}
// check for short position (SELL) possibility
if(padx2<madx2 && padx1>madx1)
{
ticket=OrderSend(symb,OP_SELL,Lot(symb,Magic),bid,Slip,bid+StopLoss*point,bid-TakeProfit*point,"",Magic,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return;
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades(string symb,int magic)
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==symb && OrderMagicNumber()==magic)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot(string symb,int magic)
{
double lot=Lots;
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==symb && OrderMagicNumber()==magic)
{
if(OrderProfit()<0)
{
lot=OrderLots()*KLot;
}
}
}
if(lot>MaxLot)lot=Lots;
return(lot);
}
//+------------------------------------------------------------------+
//| Закрывает ордера по указанному символу с указанным магиком |
//+------------------------------------------------------------------+
void CloseAll(string symb,int magic)
{
bool cl,sel;
for(int i=0; i<OrdersTotal(); i++)
{
sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==symb && OrderMagicNumber()==magic)
{
if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
}
Sleep(1000);
}
}
//+------------------------------------------------------------------+
//| Подсчитывает количество открытых ордеров согласно условиям |
//+------------------------------------------------------------------+
int SymbolOrdersTotal(string symb="",int type=-1,int magic=-1)
{
int count=0;
if(symb=="0"){symb=Symbol();}
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==symb || symb=="")
{
if(OrderType()==type || type==(-1))
{
if(OrderMagicNumber()==magic || magic==(-1))
{
count++;
}
}
}
}
}
return(count);
}
//+------------------------------------------------------------------+
extern int Candles = 20; // сколько свечей назад смотрим для поиска квадратика
extern bool alertsEmail = FALSE;
По условиям: zakaz.opentraders.ru/25597.html
уже больше шансов.
AM2