Учимся писать советник. Спреды. Часть 4.

Вчера мне не давали покоя грабли с грабительским спредом (извините за тавтологию) на паре 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: Система Мартингейл.

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий

Вы должны быть авторизованы, чтобы разместить комментарий.