
Вчера мне не давали покоя грабли с грабительским спредом (извините за тавтологию) на паре AUDCAD, на которые я ненароком наступил. Знал что спред был 8. Но это было при дневной торговле. А ночью он вырос до 16, при том что зачастую тейкпрофит ставится в 10 пунктов. Этот вопрос нужно как-то решать. Поэтому сегодня будет мало кода, но возможно он кому-то убережет нейроны от расстройства.
Вначале возникла мысль проверять существующий спред при установке ордеров, но ведь ордера могут быть и лимитными, а кто знает какой будет спред в момент его срабатывания. Да и как разруливать такую ситуацию — корректировать новый тейкпрофит? Не то чтобы проблематично, но возни будет много, а значит и вероятность напортачить также увеличивается, из одной головной боли получим другую.
Поэтому я решил просто извещать трейдера о текущем и максимальном спреде, полученным пока советник стоит на графике. Итак, небольшие но важные дополнения в исходный код. Увеличиваем счетчик версии.
... //| Forex-Grail.1.3.mq4 | /* 1.3 Отображение текущего и максимального спредов */ #define VERSION "1.30" ...
Затем введем две переменные для размера и наименования шрифта, которым мы будем выводить надписи. Не стал их делать редактируемыми. Ну и глобальные для программы показатели текущего и максимального спреда.
... //внутренние переменные int LabelFontSize = 12; string LabelFontName= "Arial"; double Spread,MaxSpread=0;//вычисляем спреды ...
В момент инициализации робота сразу выведем первичные данные. Сегодня воскресенье, рынок закрыт, тики не поступают.
... int OnInit() { ... ShowSpread(); //в выходные тики не приходят, а посмотреть охота
return(INIT_SUCCEEDED); } ...
В функции деиницилизации уничтожим все объекты на нашем графике. Но наверное лучше удалять только объекты, созданные нашим советником. А можно и оставить как напоминание о грабительских спредах вашего брокера.
... void OnDeinit(const int reason) { //ObjectsDeleteAll(0); //так мы удалим все объекты с главного графика ObjectDelete("CurrentSpread");//а так только упомянутый объект ObjectDelete("MaximumSpread"); } ...
Также при каждом тике будем получать и обновлять текущее состояние дел.
... void OnTick() { ShowSpread(); //получим спред и отобразим его HaveMoney=CheckMoney(); ...
Ну и наконец две основные функции, в которых происходит определение спреда по разнице цены покупки к цене продажи, выраженное в пунктах, и нахождение максимального значения за все время работы.
... //Выведем метку с именем labelName с текстом text //в координатах xDistance, yDistance void DrawLabel(string labelName, string text, int xDistance, int yDistance, color clr) { if (ObjectFind(labelName)==-1) { ObjectCreate(labelName, OBJ_LABEL, 0, 0, 0); ObjectSet(labelName, OBJPROP_CORNER, 1); ObjectSet(labelName, OBJPROP_XDISTANCE, xDistance); ObjectSet(labelName, OBJPROP_YDISTANCE, yDistance); } ObjectSetText(labelName,text,LabelFontSize, LabelFontName,clr); } void ShowSpread() { Spread = (Ask - Bid) / Point; //вычисляем текущий спред текущей валютной пары if (Spread > MaxSpread) MaxSpread = Spread; //если максимальный DrawLabel("CurrentSpread","Текущий спред="+DoubleToString(Spread,0),5,20,Green); DrawLabel("MaximumSpread","Максимальный спред="+DoubleToString(MaxSpread,0),5,40,Red); } ...
И низких спредов всем нам!
Предыдущая часть 3: Управление деньгами, лот в рисках от капитала.
Следующая часть 5: Система Мартингейл.