Коробка рисуется по минимуму максимуму первой часовой свече
торговля ведется от границ коробки
условие: при пробитии верхней границы коробки линией бид открывается 2 одинаковых ордера бай
1 ордер закрывается при соотношении 1:1 при этом у второго ордера закрывается половина, остальная часть ордера при соотношение
1:3
Если 1 ордер закрылся по профиту а 2 ордер с минусом то на продажу должны открываем 2 ордера тем же лотом если оба ордера закрылись в минус открываем 2 ордера на продажу удвоенным лотом
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot()
{
double lot=Lots;
if(Losses()>1) lot=Lots*KLot*Losses();
if(lot>MaxLot)lot=Lots;
return(lot);
}
убыточные ордера закрываются при открытие
противоположных ордеров при пробитии нижней границы коробки линией аск
торголя ведется до 21 часа по терминальному времени все открытые ордера закрываются
//+------------------------------------------------------------------+
//| Vector.mq4 |
//| Copyright 2017, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property strict
//--- Inputs
extern double Lots = 0.1; // лот
extern double KLot = 1; // умножение лота
extern double MaxLot = 5; // максимальный лот
extern int StopLoss = 0; // лось
extern int TakeProfit = 0; // язь
extern int Slip = 30; // реквот
extern int Shift = 1; // на каком баре сигнал индикатора
extern int Magic = 123; // магик
extern string IndName="FOREX VECTOR";
datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
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,NULL,Magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot()
{
double lot=0;
lot=Lots*MathPow(KLot,Losses());
return(lot);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Losses()
{
int losses=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
}
return(losses);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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 OpenPos()
{
double buy = iCustom(NULL,0,IndName,24,60,5,200,12,0,Shift);
double sell = iCustom(NULL,0,IndName,24,60,5,200,12,1,Shift);
if(buy<1000)
{
PutOrder(0,Ask);
}
if(sell<1000)
{
PutOrder(1,Bid);
}
}
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
{
bool cl;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ClosePos()
{
double buy = iCustom(NULL,0,IndName,24,60,5,200,12,0,Shift);
double sell = iCustom(NULL,0,IndName,24,60,5,200,12,1,Shift);
if(buy<1000)
{
CloseAll(1);
}
if(sell<1000)
{
CloseAll(0);
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double buy = iCustom(NULL,0,IndName,24,60,5,200,12,true,0,Shift);
double sell = iCustom(NULL,0,IndName,24,60,5,200,12,true,1,Shift);
if(CountTrades()<1)
{
OpenPos();
}
else ClosePos();
Comment("\n buy: ",buy,
"\n sell: ",sell,
"\n losses: ",Losses(),
"\n lot: ",Lot());
}
//+------------------------------------------------------------------+
В тестере судя по всему это не проверить. Только в терминале. Открыли, закрыли в ручную позицию и смотрим на действия советника
Совсем упустил из виду, что сделка открытая помощником должна закрываться сразу, как закрылась открытая советником. Формулу додумал
но если поставить мартин 0, тоесть отключить его, то пропускает входы
на скрине высота коробки 239, а в настройках диапозон работы стоит для наглядности 500 и не открывает ордера.
if(CountTrades()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin) && gamma<=Gamma)
{
if(StopLimit==1)
{
if(CountOrders(4)<1 && Bid<up) PutOrder(4,up+Delta*Point);
if(CountOrders(5)<1 && Bid>dn) PutOrder(5,dn-Delta*Point);
}
if(StopLimit==2)
{
if(CountOrders(2)<1 && Bid>dn) PutOrder(2,up-Delta*Point);
if(CountOrders(3)<1 && Bid<up) PutOrder(3,dn+Delta*Point);
}
}
Кроме этого все есть:
AM2