« Предыдущий пост | На главную страницу | Следующий пост »

Эксперт по теории Хаоса Б.Вильямса: определение текущего состояния (исходный код)

В прошлом выпуске я рассказал о том, как при запуске эксперта определить его состояние, т.е. стоим ли мы в покупку, или же мы медвежим, или же мы квадратные (т.е. без открытых позиций).

В этом выпуске я выложу полный исходный код того, что у нас на данном этапе получилось.

//+------------------------------------------------------------------+
//|                                                 BW-AV.mq4 |
//|                                          Andrey Vedikhin |
//|                                http://www.vedikhin.ru |
//+------------------------------------------------------------------+
#property copyright "Andrey Vedikhin"
#property link      "http://www.vedikhin.blog-forex.org"
//---- input parameters extern double Lots=1.0;
// существует три состояния, в которых мы можем находиться #define STATUS_LONG 0 // мы стоим в покупку #define STATUS_SHORT 1 // мы стоим в продажу #define STATUS_NO_POSITIONS 2 // у нас открытых позиций
// текущий статус int CurrentStatus;
// каждый нами написанный эксперт будет иметь свой ID номер от 000 до 999 // пусть эксперт по теории Хаоса имеет уникальный номер 1, // т.к. это наш первый "боевой" эксперт #define EXPERT_ID 1
// магическое число для этого эксперта и периода графика int MagicNumber;
//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- // Сформируем уникальное магическое число для этого эксперта с учетом периода MagicNumber = GetMagicNumber();
// Запомним последний сформировавшийся бар, как последний обработанный бар
// Пробежимся по всем открытым позиция, которые были открыты этим // экспертом (магическое число совпадает): в зависимости от их наличия // и направления установим текущий статус эксперта CurrentStatus = STATUS_NO_POSITIONS;
for(int pos=0; pos<OrdersTotal(); pos++) { // выделим позицию или ордер if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) { // произошла ошибка при выделении Print("Ошибка ", GetLastError(), ": не могу выделить ордер ", pos); continue; }
// позиция по нашему инструменту? if(OrderSymbol()!=Symbol()) continue;
// позиция выделена - проверим, что это не отложенный ордер if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
// проверим, что магическое число совпадает if(OrderMagicNumber() != GetMagicNumber()) continue;
// если это позиция на покупку if(OrderType() == OP_BUY) { if(CurrentStatus == STATUS_SHORT) { // у нас разнонаправленные позиции, открытые этим экспертом // на этом периоде, или другой эксперт использует наше магическое число Print("Ошибка: обнаружены разнонаправленные позиции, открытые", " этим экспертом на этом периоде, или другой эксперт использует ", "наше магическое число"); break; } else CurrentStatus = STATUS_LONG; } // если это позиция на продажу else { if(CurrentStatus == STATUS_LONG) { // у нас разнонаправленные позиции, открытые этим экспертом // на этом периоде, или другой эксперт использует наше магическое число Print("Ошибка: обнаружены разнонаправленные позиции, открытые", " этим экспертом на этом периоде, или другой эксперт использует ", "наше магическое число"); break; } else CurrentStatus = STATUS_SHORT; } }
switch(CurrentStatus) { case STATUS_SHORT: Print("Мы стоим в продажу"); break; case STATUS_LONG: Print("Мы стоим в покупку"); break; case STATUS_NO_POSITIONS: Print("У нас нет открытых позиций"); break; } //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //----
//---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- // Если мы уже обрабатывали последний сформировавшийся бар, то выйдем // Если не обрабатывали, то запомним, что мы его сейчас начали обрабатывать
// Если наш текущий статус равен STATUS_NO_POSITIONS:
// Проверим, не сработал ли какой-нибудь из фракталов: на покупку // или на продажу.
// Если сработал по графику, то открываем соответствующую // позицию (сразу ставим стоп лосс), меняем статус и выходим
// Если не сработал, то просто выходим, т.к. первый сигнал всегда - // от фрактала
// Пробежимся по всем открытым позициям, открытым этим экспертом // по этому инструменту, и переставим стоп-лосс на новый уровень
// Если наш текущий статус равен STATUS_LONG, то:
// Если у нас сигнал в покупку из первого измерения, то открываем // еще одну позицию в покупку (сразу ставим стоп лосс)
// Если у нас сигнал в покупку из второго измерения, то открываем // еще одну позицию в покупку (сразу ставим стоп лосс)
// Если у нас сигнал в покупку из третьего измерения, то открываем // еще одну позицию в покупку (сразу ставим стоп лосс)
// Если у нас сигнал в покупку из четвертого измерения, то открываем // еще одну позицию в покупку (сразу ставим стоп лосс)
// Выходим
// Если наш текущий статус равен STATUS_SHORT, то:
// Если у нас сигнал в продажу из первого измерения, то открываем // еще одну позицию в продажу (сразу ставим стоп лосс)
// Если у нас сигнал в продажу из второго измерения, то открываем // еще одну позицию в продажу (сразу ставим стоп лосс)
// Если у нас сигнал в продажу из третьего измерения, то открываем // еще одну позицию в продажу (сразу ставим стоп лосс)
// Если у нас сигнал в продажу из четвертого измерения, то открываем // еще одну позицию в продажу (сразу ставим стоп лосс)
// Выходим //---- return(0); } //+------------------------------------------------------------------+ //| GetMagicNumber() - возвращает магическое | //| число, которое вычисляется по следующему | //| алгоритму: младшие три разряда - | //| уникальный ID эксперта (в нашем случае | //| равен EXPERT_ID), а следующие пять | //| разрядов - период графика | //+------------------------------------------------------------------+ int GetMagicNumber() { int id;
// разряды 0-2 (младшие три разряда): уникальный ID эксперта id = EXPERT_ID;
// разряды 3-7 (следующие пять разрядов): период графика id = id + 1000*Period();
return(id); } //+------------------------------------------------------------------+

В следующем выпуске я расскажу, как анализировать только сформировавшиеся бары.

« Предыдущий пост | На главную страницу | Следующий пост »

Комментарии по теме "Эксперт по теории Хаоса Б.Вильямса: определение текущего состояния (исходный код)"

Мои теоретические изыскания и практические исследования привели меня к следующим умозаключениям:-)

Теория BW жизнеспособна и действительно может давать неплохой результат.
Мой источник знаний по теории BW опирался на материалы по торговле на фондовой и товарной бирже. На мой взгляд, применительно к Forex, необходимы некоторые незначительные адаптационные дополнения и измемения.
Например я пришел к выводу(заметил проанализировав), что сигнал из первого измерения достаточно часто преодолевается ложно. Т.е. прежде чем преодолеется фрактал в истинном по ходу направлении происходит как бы размах и преодолевается противоположный "ложный" фрактал. Бывает, что такая раскачка перед движением происходит два, три, а то и четыре раза, что приводит к существенным ЛОСЯМ:-)
Еще можно видеть, что после преодоления цена почти всегда возвращается назад и только затем продолжает движение ( или идет в противоположном направлении:-)

Я поступаю так:
после преодоления фрактала, позицию не открываю, а лишь фиксирую "низкий старт" - готовность №1 к сделке. Затем возможны два варианта.
1) Если цена закрытия бара не прошла сигнал фрактала, то действую по теории-ставим стоп приказ на 1 пипс за фрактал.
2) Если цена закрылась за фракталом, то тут есть четыре варианта:
а)открыться в направлении движения по текущей цене - мне не нравится
б)считать виртуально находящимся в сделке и работать по сигналам из других измерений- приемлем
в)Выставить лимит ордер, как я уже говорил, часто цена возвращается и цепляет сигнал- тоже ничего.
г)И наконец пропустить цену вниз и только после этого выставить стоп приказ.

Я в реале комбинирую второй и четвертый варианты.

Подписаться на мою рассылку



Размещение статьи "Эксперт по теории Хаоса Б.Вильямса: определение текущего состояния (исходный код)" на Вашем сайте

Размещение статьи "Эксперт по теории Хаоса Б.Вильямса: определение текущего состояния (исходный код)" на Вашем сайте возможно при условии выполнениия следующих условий:

  • Запрещается изменение оригинального текста без согласия автора - Андрея Ведихина.
  • Должен быть указан первоисточник. В случае публикации в интернете Вы должны разместить следующий код гиперссылки без изменений:
  • Запрещается коммерческое использование материалов, взятых с блога "Интернет-трейдинг на форекс / forex". Доступ к ним должен быть свободным, без взимания какой-либо платы, без обязательной регистрации и/или заполнения опросного листа (анкеты) и т.д.

В случае выполнения данных условий не требуется согласия автора блога "Интернет-трейдинг на форекс / forex" на размещение статьи "Эксперт по теории Хаоса Б.Вильямса: определение текущего состояния (исходный код)" на Вашем сайте.

Журнал FOREX MAGAZINE:



Архив номеров FOREX MAGAZINE
Котировки Forex:

Счетчики:

Авторские права © 2005-2006 Андрей Ведихин

Условия использования материалов блога "Интернет-трейдинг на форекс / forex"

Контакты с автором:


Движок сайта:
Movable Type 5.04