//+------------------------------------------------------------------+
//| Spirit.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 int Expiration = 24; //время истечения ордера в часах
extern double Lots = 0.1; //лот
extern int Slip = 3; //проскальзывание
extern int Count = 1; //количество ордеров
extern int Magic = 123; //магик
int res,err;
double sl,tp;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
Comment("");
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountBuyStopOrders()
{
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_BUYSTOP)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountSellStopOrders()
{
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_SELLSTOP)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
{
if(n<0) return(NormalizeDouble(d, Digits));
return(NormalizeDouble(d, n));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DelOrder()
{
bool del=true;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUYSTOP) del=OrderDelete(OrderTicket());
if(OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
if(del==false)
{
err=GetLastError();
Print("ОШИБКА УДАЛЕНИЯ ОРДЕРА: ",err,"(",ErrorDescription(err),")");
} else {
RefreshRates();
}
}
}
}
}
//+------------------------------------------------------------------+
int LastDealResult()
{
int result=0;
if(OrdersHistoryTotal()==0)
{
result=0;
}
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
{
if(OrderProfit()>0)
{
result=1;//tp
}
if(OrderProfit()<0)
{
result=2;//sl
}
}
}
return(result);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOtlOrder()
{
double price;
double ASK=MarketInfo(NULL,MODE_ASK);
double BID=MarketInfo(NULL,MODE_BID);
//--- sellstop
if(BID>iLow(Symbol(),PERIOD_D1,1))
{
if(CountSellStopOrders()<1)
{
price=fND(iLow(Symbol(),PERIOD_D1,1)-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*Expiration,Red);
if(res<0)
{
err=GetLastError();
Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА SELLSTOP: ",err,"(",ErrorDescription(err),")");
} else {
RefreshRates();
}
}
}
//--- buystop
if(ASK<iHigh(Symbol(),PERIOD_D1,1))
{
if(CountBuyStopOrders()<1)
{
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*Expiration,Blue);
if(res<0)
{
err=GetLastError();
Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА BUYSTOP: ",err,"(",ErrorDescription(err),")");
} else {
RefreshRates();
}
}
}
return;
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountTrades()<Count) PutOtlOrder();
if(LastDealResult()==1) DelOrder();
Comment("\n Count Orders ");
}
//+------------------------------------------------------------------+

AM2