//+------------------------------------------------------------------+
//| Delta.mq4 |
//| Copyright © 2014, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, AM2"
#property link "http://www.forexsystems.biz"
#property description "Forex expert advisor"
//--- Inputs
extern int Delta = 200; // расстояние до ордера и стопы
extern int Slip = 30; // проскальзывание ордера
extern int Try = 5; // количество попыток выставить ордер
extern double Lots = 0.1; // объем позиции
extern double MaxLot = 5; // максимальный объем позиции
extern double TickVol = 11.5; // тиковый объем
extern int MAGIC = 333; // магик
double lot;
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void PutOrder()
{
int res,b,s,err;
double price;
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)b++;
if(OrderType()==OP_SELLSTOP)s++;
}
}
}
//--- buy
if(b<1)
{
price=Ask+Delta*Point;
res=OrderSend(Symbol(),OP_BUYSTOP,Lot(),fND(price),Slip,fND(price-Delta*Point),fND(price+Delta*Point),"",MAGIC,0,Blue);
if(res<0)
{
Print("Ошибка: ",GetLastError());
err++;
Sleep(500);
RefreshRates();
}
else
Print("OK Order BUYSTOP");
}
//--- sell
if(s<1)
{
price=Bid-Delta*Point;
res=OrderSend(Symbol(),OP_SELLSTOP,Lot(),fND(price),Slip,fND(price+Delta*Point),fND(price-Delta*Point),"",MAGIC,0,Red);
if(res<0)
{
Print("Ошибка: ",GetLastError());
err++;
Sleep(500);
RefreshRates();
}
else
Print("OK Order SELLSTOP");
}
if (err>Try) return;
}
//+------------------------------------------------------------------+
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()==OP_BUYSTOP) del=OrderDelete(OrderTicket());
if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
}
}
}
}
//+------------------------------------------------------------------+
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));
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double Lot()
{
if(OrdersHistoryTotal()==0)
{
lot=Lots;
}
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderProfit()>0)
{
lot=Lots;
}
if(OrderProfit()<=0)
{
lot=OrderLots()*2;
}
}
if(lot>MaxLot)lot=MaxLot;
return(lot);
}
//+------------------------------------------------------------------+
void ClosePos()
{
double tickvol=MarketInfo(Symbol(),MODE_TICKVALUE);
//---
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
//--- check order type
if(OrderType()==OP_BUY)
{
if(tickvol>=TickVol)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
Print("OrderClose error ",GetLastError());
}
break;
}
if(OrderType()==OP_SELL)
{
if(tickvol>=TickVol)
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
Print("OrderClose error ",GetLastError());
}
break;
}
}
//---
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- check for history and trading
if(Bars<100 || IsTradeAllowed()==false)
return;
if(CountTrades()<1)PutOrder();
if(CountTrades()>0)DelOrder();
if(TickVol>0) ClosePos();
//---
}
//+------------------------------------------------------------------+
//--- Inputs
extern int StopLoss = 500; // стоп лосс ордера
extern int TakeProfit = 500; // тейк профит ордера
extern int Slip = 3; // проскальзывание ордера
extern int Try = 5; // количество попыток выставить ордер
extern int CountCandle = 6; // количество свечек для расчета
extern int Delta = 100; // расстояние AB
extern double Lots = 1; // объем позиции
//----
extern int period = 92; // период средней Slope Directional Line
extern int method = 2; // метод средней(SMA=0,EMA=1,SMMA=2,LWMA=3)
extern int price = 0; // цена по которой строится средняя
//----
extern int MAGIC = 333; // магик
int err;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
if(Digits==2 || Digits==4)
{
TakeProfit/=10;
StopLoss/=10;
Slip/=10;
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void OpenPos()
{
int res,pos;
//--- get Moving Average
double SlopeBlue=iCustom(Symbol(),0,"Slope",period,method,price,0,1);
double SlopeRed=iCustom(Symbol(),0,"Slope",period,method,price,1,1);
double up=iHigh(Symbol(),0,iHighest(NULL,0,MODE_HIGH,CountCandle,1));
double dn=iLow(Symbol(),0,iLowest(NULL,0,MODE_LOW,CountCandle,1));
Comment("\nSlope Blue ",SlopeBlue,"\nSlope Red ",SlopeRed);
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
{
if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
{
if(OrderType()==OP_BUY) pos++;
if(OrderType()==OP_SELL)pos++;
if(OrderType()==OP_BUYSTOP) pos++;
if(OrderType()==OP_SELLSTOP)pos++;
}
}
}
//--- sell conditions
if(SlopeBlue-High[1]<=50*Point && SlopeBlue==SlopeRed && Close[0]<SlopeBlue && pos<1 &&//вход на касании линии
Close[0]-dn>=Delta*Point)
{
res=OrderSend(Symbol(),OP_SELLSTOP,Lots,dn,3,dn+StopLoss*Point,dn-TakeProfit*Point,"",MAGIC,0,Red);
if(res<0)
{
Print("Ошибка: ",Error(GetLastError()));
err++;
Sleep(500);
RefreshRates();
}
else
Print("OK Order SELL STOP");
return;
}
//--- buy conditions
if(Low[1]-SlopeBlue<=50*Point && SlopeBlue!=SlopeRed && Close[0]>SlopeBlue && pos<1 &&//вход на касании линии
up-Close[0]>=Delta*Point)
{
res=OrderSend(Symbol(),OP_BUYSTOP,Lots,up,3,up-StopLoss*Point,up+TakeProfit*Point,"",MAGIC,0,Blue);
if(res<0)
{
Print("Ошибка: ",Error(GetLastError()));
err++;
Sleep(500);
RefreshRates();
}
else
Print("OK Order BUY STOP");
return;
}
if(err>Try) return;
}
//+------------------------------------------------------------------+
void ClosePos()
{
double SlopeBlue=iCustom(Symbol(),0,"Slope",period,method,price,0,1);
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
{
if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
{
if((OrderType()==OP_BUY || OrderType()==OP_BUYSTOP) && Close[1]<SlopeBlue)
{
DelOrder();
}
if((OrderType()==OP_SELL || OrderType()==OP_SELLSTOP) && Close[1]>SlopeBlue)
{
DelOrder();
}
}
}
}
}
//+------------------------------------------------------------------+
void DelOrder()
{
bool del;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
{
if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderType()==OP_BUYSTOP) del=OrderDelete(OrderTicket());
if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
if (OrderType()==OP_BUY) del=OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White);
if (OrderType()==OP_SELL) del=OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White);
if(del==false)
{
Print("Ошибка: ",Error(GetLastError()));
err++;
Sleep(500);
RefreshRates();
}
else
Print("OK Delete Order ");
}
}
}
if(err>Try) return;
}
//+------------------------------------------------------------------+
bool NewBar()
{
static datetime lastbar = 0;
datetime curbar = Time[0];
if(lastbar!=curbar)
{
lastbar=curbar;
return (true);
}
else
{
return(false);
}
}
//+------------------------------------------------------------------+
string Error(int error_code)
{
string error_string;
//----
switch(error_code)
{
//---- Коды ошибок, возвращаемые торговым сервером:
case 0: error_string="Нет ошибок"; break;
case 1: error_string="Нет ошибки, но результат неизвестен"; break;
case 2: error_string="Общая ошибка"; break;
case 3: error_string="Неправильные параметры"; break;
case 4: error_string="Торговый сервер занят"; break;
case 5: error_string="Старая версия клиентского терминала"; break;
case 6: error_string="Нет связи с торговым сервером"; break;
case 7: error_string="Недостаточно прав"; break;
case 8: error_string="Слишком частые запросы"; break;
case 9: error_string="Недопустимая операция нарушающая функционирование сервера"; break;
case 64: error_string="Счет заблокирован"; break;
case 65: error_string="Неправильный номер счета"; break;
case 128: error_string="Истек срок ожидания совершения сделки"; break;
case 129: error_string="Неправильная цена"; break;
case 130: error_string="Неправильные стопы"; break;
case 131: error_string="Неправильный объем"; break;
case 132: error_string="Рынок закрыт"; break;
case 133: error_string="Торговля запрещена"; break;
case 134: error_string="Недостаточно денег для совершения операции"; break;
case 135: error_string="Цена изменилась"; break;
case 136: error_string="Нет цен"; break;
case 137: error_string="Брокер занят"; break;
case 138: error_string="Новые цены"; break;
case 139: error_string="Ордер заблокирован и уже обрабатывается"; break;
case 140: error_string="Разрешена только покупка"; break;
case 141: error_string="Слишком много запросов"; break;
case 145: error_string="Модификация запрещена, так как ордер слишком близок к рынку"; break;
case 146: error_string="Подсистема торговли занята"; break;
case 147: error_string="Использование даты истечения ордера запрещено брокером"; break;
case 148: error_string="Количество открытых и отложенных ордеров достигло предела, установленного брокером.";break;
default: error_string="Неизвестная ошибка.";
}
//----
return(error_string);
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- check for history and trading
if(Bars<100 || IsTradeAllowed()==false)
return;
if(NewBar()==true)
{
OpenPos();
ClosePos();
}
//---
}
//+------------------------------------------------------------------+
Оказалось проще написать с нуля чем разбираться в чужом коде.
Файл в базе: www.opentraders.ru/downloads/528/
AM2