//+------------------------------------------------------------------+
//| StopLimit.mq4 |
//| Copyright 2017, AM2 |
//| http://www.forexsyatems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, AM2"
#property link "http://www.forexsyatems.biz"
#property version "1.00"
#property strict
//--- Inputs
extern double Lots = 0.1; // лот
extern double KLot = 1; // умножение лота
extern double MaxLot = 5; // максимальный лот
extern int StopLoss = 50; // лось
extern int TakeProfit = 70; // язь
extern int StopLimit = 0; // 0-stop 1-limit
extern int Last = 0; // 0-также 1-обрат
extern int Delta = 100; // дельта
extern int Slip = 30; // реквот
extern int Magic = 123; // магик
int last=0;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr=Green;
double sl=0,tp=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);
}
r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу |
//+------------------------------------------------------------------+
int CountOrders(int type)
{
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()==type) 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());
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot()
{
double lot=Lots;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderProfit()<0) break;
if(OrderProfit()>0)
{
lot=OrderLots()*KLot;
break;
}
}
}
if(lot>MaxLot)lot=Lots;
return(lot);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades()
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()<2) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int LastType()
{
int tp=-1;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()>1) tp=OrderType();
break;
}
}
}
return(tp);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountTrades()<1)
{
if(((LastType()==4 || LastType()==5) && Last==0) || ((LastType()==2 || LastType()==3) && Last==1))
{
if(CountOrders(4)<1) PutOrder(4,Bid+Delta*Point);
if(CountOrders(5)<1) PutOrder(5,Bid-Delta*Point);
}
if(((LastType()==2 || LastType()==3) && Last==0) || ((LastType()==4 || LastType()==5) && Last==1))
{
if(CountOrders(2)<1) PutOrder(2,Bid-Delta*Point);
if(CountOrders(3)<1) PutOrder(3,Bid+Delta*Point);
}
if(StopLimit==0 && LastType()==-1)
{
if(CountOrders(4)<1) PutOrder(4,Bid+Delta*Point);
if(CountOrders(5)<1) PutOrder(5,Bid-Delta*Point);
}
if(StopLimit==1 && LastType()==-1)
{
if(CountOrders(2)<1) PutOrder(2,Bid-Delta*Point);
if(CountOrders(3)<1) PutOrder(3,Bid+Delta*Point);
}
}
if(CountTrades()>0) DelOrder();
Comment(LastType());
}
//+------------------------------------------------------------------+
extern int CloseOrders=0; // 1-Close All Orders
double Lot()
{
double lot=Lots;
switch(MMType)
{
case 0:
lot=Lots;
break;
case 1:
if(CountTrades()>1) lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),LotsDigits);
break;
case 2:
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderProfit()>0) break;
if(OrderProfit()<0)
{
lot=OrderLots()*KLot;
break;
}
}
}
}
if(lot>MaxLot)lot=Lots;
return (lot);
}
Андрей, спасибо, все работает как надо, только в советника мартин, а хотелось бы чтобы первые стоповые ордера открывались допустим лотом 1, после того как сработает один из первых стоповых ордеров все последующие отложенные ордера открывались допустим только лотом 2, пока все не закроется по общему профиту, после чего снова открываются два отложенные ордера первоначальным лотом.
if(CountTrades()>0)
{
if(CountOrders(4)<1 && LastOrderType()==0) PutOrder(5,LastOrderPrice()-Step*Point,Lots*2);
if(CountOrders(5)<1 && LastOrderType()==1) PutOrder(4,LastOrderPrice()+Step*Point,Lots*2);
}
AM2