Небольшое исправление в эксперте внесите пожалуйста кому не трудно:)

 

Здравствуйте.


В приложении советник.


Необходимо убрать в советнике участок кода, открывающего по текущей цене и

поставить вместо этого отложенный ордер максимально близко от текущей цены, с повтором попытки,

если не удалось в первый раз.


Кратко о стратегии, по которой работает эксперт:


При закрытии предыдущей свечи, определяется Лоу и Хай этой свечи и

выставляются отложенные ордера над Хай и под Лоу.

Беда в том, что если текущая цена слишком близко от экстремума, то точно выставить ордер не удавалось,

поэтому было принято решение - открывать с текущих, когда цена достигала точки, преодолевающей экстремум.


На данный момент это решение признано ошибочным и требуется исключить участок кода, открывающего с текущих,

вместо этого - просто выставлять только и исключительно отложенные ордера, просто максимально близко к

необходимой точке.

Эта Стратегия обсуждалась здесь: https://forum.mql4.com/ru/15958


Спасибо!

Файлы:
 
//+------------------------------------------------------------------+
//| MR.mq4 |
//| Copyright © 2007 Олег Слободян |
//| olegplus@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Oleg Slobodjan "
#property link "mailto: olegplus@yandex.ru"

#include <stderror.mqh>
#include <stdlib.mqh>

extern int MAGIC = 308; // 
extern double MinLot=0.01; //Самый маленький лот, с которого начинает торговлю любой процесс 
extern int LotDigit = 2; // возможных знаков после запятой

extern int HourBegin = 8;
extern int MinuteBegin = 0;
extern int TP=500;//Профит

int Ticket[1000];
double lots;
int nBuystop, nSellstop;
double tBuy, tSell;

int CountAllOrders(int dir, int SysID)
{
int total=OrdersTotal(), i, c=0; if (total<=0) return (0);
for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType()==dir) && (OrderMagicNumber()==SysID)) {c=c+1;} }
return (c);
}

int CreatTicketArray(int dir, int SysID)
{
int total=OrdersTotal(), i, c=1; if (total<=0) return (0);
for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType()==dir) && (OrderMagicNumber()==SysID)) { Ticket[c] = OrderTicket(); c++; } }
return (c-1);
}

int init() 
{ 
}

int deinit() { return(0); }

void start()
{
Process(); 
// экспертом рассчитывается ТП для всех открытых Бай ордеров = ТП в параметрах, 
// чтобы при закрытии всех Бай ордеров – общий ТП равнялся TP. 
Trailing(MAGIC, Green, Red);
}

void Process()
{
int i,k, total;
datetime time;
//В 00:00 удаляем старые отложки 
nBuystop = CountAllOrders(OP_BUYSTOP, MAGIC);
nSellstop = CountAllOrders(OP_SELLSTOP, MAGIC);
i = TimeHour(TimeCurrent());
k = TimeMinute(TimeCurrent());
if (i>=0 && i<=HourBegin-1)
{
total = CreatTicketArray(OP_BUYSTOP, MAGIC); for (i=1; i<=total; i++) OrderDelete(Ticket[i], Green);
total = CreatTicketArray(OP_SELLSTOP, MAGIC); for (i=1; i<=total; i++) OrderDelete(Ticket[i], Green);
tBuy = 0; tSell = 0;
return;
}
i = TimeHour(TimeCurrent());
k = TimeMinute(TimeCurrent());
if(i>=0 && i==HourBegin && k==MinuteBegin)
{
// если уже TimeBegin то 
lots = AccountFreeMargin()*0.1*0.00001; //начальный лот
lots = NormalizeDouble(lots, LotDigit); //округлили до знаков минимального лота
if (MinLot>lots) lots = MinLot;// если текущйи баланс меньше минимального

if(MinuteBegin>=10) time = StrToTime((HourBegin-1)+":"+MinuteBegin);//нашли свечку для Low и High
if(MinuteBegin<10) time = StrToTime((HourBegin-1)+":0"+MinuteBegin);//нашли свечку для Low и High
i = iBarShift(NULL, 0, time);
// выставляются отложенные ордера БайСтоп над свечой и СеллСтоп под свечой (TimeBegin-1) на H+1 и L-2 пунктах
if (nBuystop<=0 && tBuy<=0) 
{
if (Ask>=(High[i]+5*Point))
tBuy = OrderSend(Symbol(), OP_BUY, lots, Ask, 2, 0, High[i]+Point*TP, "BuyMR", MAGIC, 0, CLR_NONE);
else
tBuy = OrderSend(Symbol(), OP_BUYSTOP, lots, High[i]+5*Point, 2, 0, High[i]+Point*TP, "BuyMR", MAGIC, 0, CLR_NONE);
// Sleep (3000);//подождали 3 сек
}
if (nSellstop<=0 && tSell<=0) 
{
if (Bid<=(Low[i]-1*Point))
tSell = OrderSend(Symbol(), OP_SELL, lots, Bid, 2, 0, Low[i]-Point*TP, "SellMR", MAGIC, 0, CLR_NONE);
else
tSell = OrderSend(Symbol(), OP_SELLSTOP, lots, Low[i]-1*Point, 2, 0, Low[i]-Point*TP, "SellMR", MAGIC, 0, CLR_NONE);
// Sleep (3000);//подождали 3 сек
 
}
}
}

void Trailing(int SysID, color ClrBuy, color ClrSell)
{
int i, total = OrdersTotal(); if (total<=0) return;
double Profit, price, nTP=0.0; 
int pos, pp;
double m, m2, avgLevel, lots, lot1, newPrice, dSLPre;

total = CreatTicketArray(OP_BUY, SysID); Profit=0.0;
if (total>0) //Заглушка для OP_BUY
{//1. Подсчитали прибыль по всем ордерам открытым в направлении dir
for (i=1; i<=total; i++) { OrderSelect(Ticket[i], SELECT_BY_TICKET); Profit = Profit+(Bid-OrderOpenPrice())*OrderLots(); }
//Находим середину всех сделок (точка, когда все + и - позы дают прибыль=0)
m=0.0; m2=0.0; avgLevel=0.0;
OrderSelect(Ticket[1], SELECT_BY_TICKET); avgLevel=OrderOpenPrice(); m = OrderLots(); 
for (i=2; i<=total; i++)
{ OrderSelect(Ticket[i], SELECT_BY_TICKET); m2 = OrderLots(); avgLevel = avgLevel-(m2*(avgLevel-OrderOpenPrice()))/(m2+m); m = m+m2;}

if (total>1) 
for (i=1; i<=total; i++)
{ 
OrderSelect(Ticket[i], SELECT_BY_TICKET);
// if (OrderTakeProfit()<avgLevel) 
OrderModify(Ticket[i],0, OrderStopLoss(), avgLevel+Point*(TP/total), 0, ClrBuy);
}
}

total = CreatTicketArray(OP_SELL, SysID); Profit=0.0;
if (total>0) //Заглушка
{//1. Подсчитали прибыль по всем ордерам открытым в направлении dir
for (i=1; i<=total; i++) { OrderSelect(Ticket[i], SELECT_BY_TICKET); Profit = Profit + (OrderOpenPrice()-Ask)*OrderLots(); }
//Находим середину всех сделок (точка, когда все + и - позы дают прибыль=0)
m=0.0; m2=0.0; avgLevel=0.0;
OrderSelect(Ticket[1], SELECT_BY_TICKET); avgLevel=OrderOpenPrice(); m = OrderLots(); 
for (i=2; i<=total; i++)
{ OrderSelect(Ticket[i], SELECT_BY_TICKET); m2 = OrderLots(); avgLevel = avgLevel+(m2*(OrderOpenPrice()-avgLevel))/(m2+m); m = m+m2; }
if (total>1) 
for (i=1; i<=total; i++)
{ 
OrderSelect(Ticket[i], SELECT_BY_TICKET);
// if (OrderTakeProfit()>avgLevel) 
OrderModify(Ticket[i],0, OrderStopLoss(), avgLevel-Point*(TP/total), 0, ClrSell);
}
}
return;
}
//+------------------------------------------------------------------+