English 中文 Español Deutsch 日本語 Português
Файл Lite_EXPERT2.mqh - функциональный конструктор экспертописателя

Файл Lite_EXPERT2.mqh - функциональный конструктор экспертописателя

MetaTrader 4Торговые системы | 2 июня 2009, 09:38
4 760 6
Nikolay Kositsin
Nikolay Kositsin

Введение

В своих статьях "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота" 1, 2, 3, 4, 5, 6, 7 я познакомил начинающих экспертописателей со своим подходом к написанию экспертов, позволяющим достаточно легко воплощать торговые стратегии в максимально простой и быстро реализуемый программный код с использованием готовых пользовательских торговых функций файла Lite_EXPERT1.mqh. Вполне естественно, что для максимальной простоты изложения материала в этом файле было использовано минимальное количество пользовательских функций, достаточное для того, чтобы без проблем, так сказать, набить руку в этом деле.

Но для гораздо более полноценной работы с программным кодом возможностей функций этого файла всё-таки немного недостаточно. Для решения этой задачи и был написан файл Lite_EXPERT2.mqh, содержащий более универсальный, хотя и более сложный для первоначального освоения, набор пользовательских функций. Предполагается, что читатель уже знаком с содержанием статьи "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота 1", и изучение данной, ниже представленной, статьи является для него дальнейшим развитием уже имеющихся навыков работы с подобными пользовательскими функциями.


Состав файла Lite_EXPERT2.mqh

В общем виде все функции, имеющиеся в файле Lite_EXPERT2.mqh, можно представить в виде следующей блок-схемы:

Помимо функций файл Lite_EXPERT2.mqh содержит целочисленную переменную int LastTime, объявленную на глобальном уровне, которая используется всеми торговыми функциями, и внешнюю целочисленную переменную extern int Slippage_ для слиппажа в пунктах, которая будет видимой из внешних параметров эксперта.


1. Функции для открывания позиций

Все функции этого блока можно разбить на две большие группы, у одной из которых названия функций начинаются с Open, а у другой группы с dOpen. У функций первой группы в качестве внешних переменных стоплосса и тейкпрофита используются относительные расстояния от цены открытия позиции, выраженные в пунктах. То есть они представлены целочисленными переменными.

bool OpenBuyOrder1_
        (bool& BUY_Signal, int MagicNumber, datetime TimeLevel,
                           double Money_Management, int Margin_Mode, 
                                         int STOPLOSS, int TAKEPROFIT)
                                         
bool OpenSellOrder1_
        (bool& SELL_Signal, int MagicNumber, datetime TimeLevel, 
                            double Money_Management, int Margin_Mode, 
                                          int STOPLOSS, int TAKEPROFIT)
                                          
bool OpenBuyOrder2_
        (bool& BUY_Signal, int MagicNumber, datetime TimeLevel,
                           double Money_Management, int Margin_Mode, 
                                          int STOPLOSS, int TAKEPROFIT)
                                          
bool OpenSellOrder2_
        (bool& SELL_Signal, int MagicNumber, datetime TimeLevel, 
                            double Money_Management, int Margin_Mode, 
                                          int STOPLOSS, int TAKEPROFIT)

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

Все функции, названия которых оканчиваются на "1_", предназначены для брокеров, у которых стоплосс и тейкпрофит можно ставить непосредственно при совершении сделки. А функции, в конце названия которых присутствует "2_", используются для брокеров, у которых эти ордера ставятся на уже открытую позицию.

В составе всех этих восьми функций по сравнению с функциями из файла Lite_EXPERT1.mqh появилась пара новых внешних переменных (datetime TimeLevel и int Margin_Mode). И поэтому с этими переменными следовало бы разобраться в первую очередь. Значение переменной TimeLevel представляет собой временной предел после совершения текущей сделки, до наступления которого все торговые функции этого файла открывать новых позиций и ордеров с текущим магик-номером не будут. Значение этой внешней переменной при совершении сделки сохраняется в глобальной переменной на жёстком диске компьютера, и поэтому оно не теряется при перезагрузке торгового терминала и операционной системы Windows. Самое простейшее использование этой переменной - это запрет повторного открывания позиции или установки отложенного ордера на одном баре.

//----
   static datetime TimeLevel;
   TimeLevel = Time[0] + Period() * 60;
   
   //---- 
   if (!OpenBuyOrder1_
        (BUY_Signal, MagicNumber, TimeLevel,
                           Money_Management, Margin_Mode, 
                                         STOPLOSS, TAKEPROFIT))
                                                          return(-1);

Предполагается, что инициализация статической переменной TimeLevel будет происходить в том же блоке, что и переменной BUY_Signal. Теперь если функция OpenBuyOrder1_() откроет позицию, то в этот момент она запомнит на жёстком диске в глобальной переменной значение переменной TimeLevel. И до тех пор, пока время прихода последней котировки не станет больше или равно этому значению, ни одна из функций файла Lite_EXPERT2.mqh для открывания позиций или отложенных ордеров не откроет ни одного ордера с таким магик-номером.

Таким образом, в торговых функциях этого файла в общем случае обнуления внешней переменной типа bool& BUY_Signal по ссылке нет за ненадобностью. Это обнуление может происходить только в том случае, если переменную TimeLevel инициализировать значением "-1" ! Если значение этой переменной сделать равным нулю, то функция для открывания позиции вообще ничего обнулять и запоминать не станет и будет открывать позиции по сигналам внешней переменной BUY_Signal в любой момент, когда отсутствуют ордера с магик-номером, равным значению внешней переменной int MagicNumber.

Стринговое имя, которое использовано для глобальной переменной, сохраняемой на жестком диске, собирается для тестирования и оптимизации по следующей формуле:

string G_Name_ = "TimeLevel", "_", AccountNumber(), "_", 
                                "_Test_", OrderSymbol(), "_", OrderMagicNumber());

В остальных случаях:

string G_Name_ = "TimeLevel", "_", AccountNumber(), 
                                     "_", OrderSymbol(), "_", OrderMagicNumber());

И это имя не должно использоваться для обозначения других глобальных переменных!

В торговых функциях файла Lite_EXPERT1.mqh использовался всего один способ расчёта величины лота (MM по свободным средствам на счёте). Такой способ расчёта величины лота подходит далеко не для каждой стратегии. В торговых функциях файла Lite_EXPERT2.mqh учтён этот момент, и для выбора способа расчёта величины лота использована внешняя переменная int Margin_Mode. Внешняя переменная Margin_Mode может принимать значения от нуля и до пяти и определяет способ расчёта величины лота:

  • 0 - MM по свободным средствам на счёте
  • 1 - MM по балансу средств на счёте
  • 2 - MM по убыткам от свободных средств на счёте
  • 3 - MM по убыткам от баланса средств на счёте
  • 4 - минимальный лот между 0 и 2
  • 5 - минимальный лот между 1 и 3
  • по умолчанию - MM по свободным средствам на счёте

Необходимо иметь в виду, что ежели вы используете второй или третий способ расчёта величины лота, и при этом у вас стоплосс является динамическим, то есть меняющимся от сделки к сделке, то следует учитывать, каковы граничные значения стоплосса и ММ. Например, если значение переменных Money_Management = 0.1, Margin_Mode = 3 и int STOPLOSS = 100 (пять знаков после запятой), то эксперт откроет позицию всем депозитом!

Я, на всякий случай, ещё раз поясню смысл этих двух вариантов значений переменной Margin_Mode (2 и 3). В такой ситуации функция для расчёта величины лота берёт свободные средства или баланс и умножает его на значение переменной Money_Management. Теперь полученная в результате этого сумма представляет собой убытки, которые могут быть, если позиция закроется по стоплоссу! Причём убытки, которые не зависят от размера стоплосса. Таким образом функция для расчёта величины лота, исходя из размера стоплоса, делает объём позиции таким, чтобы убытки от стоплосса оказались фиксированными!

Варианты со значениями переменной Margin_Mode равной 4 или 5 позволяют торговым функциям производить расчёт лота одновременно двумя вариантами и после этого выбирать наименьший. Например, если Margin_Mode = 5, то торговая функция рассчитает размер лота от баланса средств на счёте и размер лота по убыткам от баланса и использует то значение, которое окажется наименьшим.

Здесь хотелось бы ещё раз напомнить, что если значение переменной Money_Management отрицательное, то все эти функции игнорируют значения переменной Margin_Mode и используют значения переменной Money_Management как величину лота, вполне естественно, отбросив отрицательный знак и округлив эту величину до ближайшего стандартного значения, которое будет не больше имеющегося в наличии. Эти восемь функций при расчёте величины лота всегда проверяют наличие свободных средств на торговом счёте на предмет достаточности для совершения сделки и, если это необходимо, уменьшают рассчитанную величину лота до допустимого размера.


2. Функции для выставления отложенных ордеров

Это вторая, большая, группа функций, которые по аналогии с предыдущими разбиты на две большие группы.

bool OpenBuyLimitOrder1_
        (bool& Order_Signal, int MagicNumber, datetime TimeLevel,
                            double Money_Management, int Margin_Mode, 
                                           int STOPLOSS, int TAKEPROFIT,
                                              int LEVEL, datetime Expiration) 
bool OpenBuyStopOrder1_
        (bool& Order_Signal, int MagicNumber, datetime TimeLevel, 
                             double Money_Management, int Margin_Mode, 
                                           int STOPLOSS, int TAKEPROFIT,
                                               int LEVEL, datetime Expiration)
bool OpenSellLimitOrder1_
        (bool& Order_Signal, int MagicNumber, datetime TimeLevel, 
                            double Money_Management, int Margin_Mode, 
                                           int STOPLOSS, int TAKEPROFIT,
                                               int LEVEL, datetime Expiration)
bool OpenSellStopOrder1_
        (bool& Order_Signal, int MagicNumber, datetime TimeLevel,
                            double Money_Management, int Margin_Mode,
                                           int STOPLOSS, int TAKEPROFIT,
                                               int LEVEL, datetime Expiration)
bool dOpenBuyLimitOrder1_
        (bool& Order_Signal, int MagicNumber, datetime TimeLevel,
                            double Money_Management, int Margin_Mode, 
                                    double dSTOPLOSS, double dTAKEPROFIT,
                                           double dLEVEL, datetime Expiration)
bool dOpenBuyStopOrder1_
        (bool& Order_Signal, int MagicNumber, datetime TimeLevel, 
                             double Money_Management, int Margin_Mode, 
                                    double dSTOPLOSS, double dTAKEPROFIT,
                                            double dLEVEL, datetime Expiration)
bool dOpenSellLimitOrder1_
        (bool& Order_Signal, int MagicNumber, datetime TimeLevel, 
                            double Money_Management, int Margin_Mode, 
                                    double dSTOPLOSS, double dTAKEPROFIT,
                                            double dLEVEL, datetime Expiration)
bool dOpenSellStopOrder1_
        (bool& Order_Signal, int MagicNumber, datetime TimeLevel,
                            double Money_Management, int Margin_Mode,
                                    double dSTOPLOSS, double dTAKEPROFIT,
                                            double dLEVEL, datetime Expiration)

Всё, что было сказано про предыдущие функции, абсолютно справедливо и для этих восьми функций. Исключение составляют разве что два факта. Расчёт величины лота, исходя из того, что будет твориться в момент открывания ордера, сделать, в общем-то, невозможно, а ежели его считать на момент установки отложенного ордера, как это и делается, то едва ли можно ожидать точного соответствия расчёта значению переменной Money_Management. По этой же самой причине в этих функциях проверки величины лота на достаточность для него средств отсутствуют.


3. Функции для закрывания открытых позиций

В этот блок входит всего четыре функции

bool CloseBuyOrder1_(bool& CloseStop, int MagicNumber)

bool CloseSellOrder1_(bool& CloseStop, int MagicNumber)

bool CloseAllBuyOrders1_(bool CloseStop)

bool CloseAllSellOrders1_(bool CloseStop)

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


4. Функции для удаления отложенных ордеров

Список функций этого раздела представлен всего двумя простейшими функциями

bool CloseOrder1_(bool& CloseStop, int cmd, int MagicNumber)
bool CloseAllOrders1_(bool CloseStop, int cmd)

во внешних переменных которых появилась ещё одна, новая переменная int cmd, значения которой представлены ниже:

  • OP_BUYLIMIT 2 Отложенный ордер BUY LIMIT
  • OP_SELLLIMIT 3 Отложенный ордер SELL LIMIT
  • OP_BUYSTOP 4 Отложенный ордер BUY STOP
  • OP_SELLSTOP 5 Отложенный ордер SELL STOP


5. Функции модификации позиций и функции трейлинстопов

В состав этого блока входит три группы функций:

1) модификаторы позиций

bool dModifyOpenBuyOrder_
       (bool& Modify_Signal, int MagicNumber, 
                     datetime ModifyTimeLevel_, double dSTOPLOSS, double dTAKEPROFIT)
                         
bool dModifyOpenSellOrder_
       (bool& Modify_Signal, int MagicNumber, 
                     datetime ModifyTimeLevel_, double dSTOPLOSS, double dTAKEPROFIT)
                         
bool dModifyOpenBuyOrderS (bool& Modify_Signal, double dSTOPLOSS, double dTAKEPROFIT)
                         
bool dModifyOpenSellOrderS(bool& Modify_Signal, double dSTOPLOSS, double dTAKEPROFIT)

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

Следует учесть, что значение переменной datetime ModifyTimeLevel_ используется только в первых двух функциях этой группы и нигде более! В последних двух функциях эта переменная отсутствует вообще. Для того чтобы сделать обращение к одной из этих двух последних функций в коде эксперта, необходимо прежде выбрать ордер типа OP_BUY или OP_SELL для дальнейшей работы с ним с помощью функции OrderSelect()! Эти функции предназначены для работы с открытыми позициями, у которых нет магик-номеров. Формулы для сборки стрингового имени глобальной переменной для сохранения на жёстком диске значения переменной ModifyTimeLevel_ выглядят следующим образом:

string G_Name_ = "ModifyTimeLevel_", "_", AccountNumber(), 
                                          "_", "_Test_", Symbol(), "_", MagicNumber;
string G_Name_ = "ModifyTimeLevel_", "_", AccountNumber(),
                                                    "_", Symbol(), "_", MagicNumber;  

2) трейлинстопы

bool Make_BuyTrailingStop_
             (bool& TreilSignal, int MagicNumber, datetime TrailTimeLevel, int TRAILINGSTOP)

bool Make_SellTrailingStop_
             (bool& TreilSignal, int MagicNumber, datetime TrailTimeLevel, int TRAILINGSTOP)
        
bool dMake_BuyTrailingStop_
        (bool& TreilSignal, int MagicNumber, datetime TrailTimeLevel_, double dTRAILINGSTOP)
        
bool dMake_SellTrailingStop_
        (bool& TreilSignal, int MagicNumber, datetime TrailTimeLevel_, double dTRAILINGSTOP)

Эта группа содержит четыре классических трейлинстопа для прижимания стоплосса к текущей цене, первые два из которых имеют в качестве внешнего параметра значения трейлинстопа в пунктах относительно текущей цены, а оставшиеся два в абсолютной величине. У этих четырёх функций аналогично предыдущим также имеются ограничители времени в виде переменных TrailTimeLevel и TrailTimeLevel_ с абсолютно аналогичным значением. Если предполагается менять трейлингстопы на каждом тике, то значения этих переменных следует приравнять к нулю.

3) и ещё одна группа из четырёх модификаторов позиций,

bool BuyStoplossCorrect
           (int MagicNumber, int ExtPointProfit, int StoplossProfit)
           
bool SellStoplossCorrect
           (int MagicNumber, int ExtPointProfit, int StoplossProfit)
           
bool AllBuyStoplossCorrects (int ExtPointProfit, int StoplossProfit)
           
bool AllSellStoplossCorrects(int ExtPointProfit, int StoplossProfit)

которые производят одноразовые перестановки стоплоссов. Первые две функции отслеживают профицит в пунктах у открытой позиции с фиксированным магик-номером, и если он становится не меньше, чем значение переменной ExtPointProfit, то стоплосс прижимается к текущей цене на расстоянии StoplossProfit от цены открывания позиции.

Две последние функции из этой группы отслеживают профицит всех открытых позиций по текущему символу с любыми магик-номерами и производят одноразовые перестановки стоплоссов для них.


6. Дополнительные функции

Это последняя и, пожалуй, самая многочисленная группа функций файла Lite_EXPERT2.mqh. Причём многие функции из этой группы используются в качестве дополнительных внутри кода тех функций, что были представлены мной выше, и поэтому какого-то особого практического интереса во многих случаях не представляют. Так что я ограничусь здесь обзором только самых актуальных функций.

Прежде всего хотелось бы остановиться на функции TimeLevelGlobalVariableDel():

void TimeLevelGlobalVariableDel(string symbol, int MagicNumber)

Эта функция удаляет после тестирования и оптимизации все глобальные переменные, сохраняемые на жёсткий диск компьютера, которые были созданы торговыми функциями этого файла. Обращения к этой функции следует располагать в блоке деинициализации эксперта, например, вот так:

//+X================================================================X+
//| Custom Expert deinitialization function                          |
//+X================================================================X+  
int deinit()
  {
//----+
    TimeLevelGlobalVariableDel(Symbol(), 1);
    TimeLevelGlobalVariableDel(Symbol(), 2);
    TimeLevelGlobalVariableDel(Symbol(), 3);
    TimeLevelGlobalVariableDel(Symbol(), 4);
    //---- Завершение деинициализации эксперта
    return(0);
//----+ 
  }

Если этого не сделать, то оставшиеся после тестирования или оптимизации глобальные переменные с последними значениями времени будут блокировать тестирование и оптимизацию эксперта!!!

Очень часто в качестве внешних переменных эксперта присутствуют таймфреймы графиков, которые могут быть выбранными только из стандартного ряда значений. Набирая значение таймфрейма вручную всегда можно ошибиться и поставить неверное значение. Для проверки таких ситуаций служит функция TimeframeCheck(),

void TimeframeCheck(string TimeframeName, int Timeframe)

которая в блоке инициализации эксперта проверяет значения таймфреймов во внешних переменных.

Все расчёты для любых ценовых уровней, которые производятся в эксперте, первоначально берутся с ценовых графиков, для которых в общем случае непонятно, какие цены представлены на этих графиках - ASK или BID? И поэтому, полученные с ценовых графиков значения для их использования в торговых функциях необходимо предварительно откорректировать с учётом этой разницы. С этой задачей справляется функция dGhartVelueCorrect():

double dGhartVelueCorrect(int cmd, double& GhartVelue)

Назначение переменной cmd абсолютно аналогично тому, что представлено в справке Метаэдитора. При обращении к этой функции в качестве её внешнего параметра GhartVelue может быть только переменная, значение которой по ссылке заменяется на откорректированное. Например:

//---- получаем ценовой уровень GhartVelue_
   double GhartVelue_ = Low[0];
   //---- корректируем ценовой уровень GhartVelue_
   dGhartVelueCorrect(OP_BUY, GhartVelue_);

Ещё две функции, предназначенные для выбора ордеров для последующей работы с ними:

bool OrderSelect_(string symbol, int cmd, int MagicNumber, int pool)
bool Order_Select(string symbol, int MagicNumber)

Переменная pool может принимать всего два значения: MODE_TRADES - ордер выбирается среди открытых и отложенных ордеров, и MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров. При успешном выполнении операции функции возвращают значение true, в противном случае falsh.

В определённых ситуациях может представлять интерес функция MarginCheck(), которая проверяет величину лота на достаточность средств на счёте и в случае несоответствия уменьшает лот до размеров, при которых средств хватит:

bool MarginCheck(string symbol, int Cmd, double& Lot)

Параметр Cmd в этой функции может принимать всего два значения: OP_BUY и OP_SELL. Если расчёт прошёл нормально, то функция возвращает значение true, при ошибках в работе функции возвращается false.

И иногда может понадобиться возможность рассчитать величину лота, для этого имеется ещё пара функций:

double BuyLotCount(double Money_Management, int Margin_Mode, int STOPLOSS)
double SellLotCount(double Money_Management, int Margin_Mode, int STOPLOSS)

При отсутствии ошибок функции возвращают значение величины лота, если же возникают ошибки, то идёт возврат минус единицы.

И ещё три функции для любителей запаковывать индикаторный код в код экспертов:

int IndicatorCounted_(int Number, string symbol, int timeframe)

int ReSetAsIndexBuffer(string symbol, int timeframe, double& array[])

int ReSetAsIndexBuffer_(string symbol, int timeframe, double& Array[], int ArrSize)

Первая представляет собой аналог функции IndicatorCounted(), работающий в экспертах. Внешняя переменная Number представляет собой номер обращения к этой функции в коде эксперта (по одному номеру на индикатор).

Назначение второй функции - это превращение массива данных, объявленного на глобальном уровне в аналог индикаторного буфера. То есть эта функция синхронизирует элементы массива, название которого выступает в качестве переменной double& array[] с соответствующими массивами тайм-сериями. Обращение к данной функции должно находиться внутри функции start() за пределами действия операторов циклов, перебирающих бары графика.

Третья функция представляет собой полный аналог второй функции, но количество элементов в массиве Array[] получается ограниченным значением переменной ArrSize. То есть в данном случае в массиве присутствуют только последние, самые новые бары в количестве ArrSize. Эту функцию во многих случаях использовать оказывается цессообразнее предыдущей в ситуациях, когда в коде индикатора в такой массив значения только складываются, а в коде эксперта исользуются только последние ArrSize значений.

И наконец последние две функции:

bool IsNewBar(int Number, string symbol, int timeframe)

bool MinBarCheck(string symbol, int timeframe, int MinBarTotal)

Функция IsNewBar() возвращает значение True в момент времени, когда происходит смена бара в соответствующих массивах-таймсериях. В остальных случаях эта функция возвращает False. Переменная Number представляет порядковы номер обращения к этой функции в коде эксперта. Функция MinBarCheck() делает сравнение количества баров соответствующего графика со значением переменной MinBarTotal, и если их оказывется мало, то делает возврат значения Falsh. Эта функция используется для запрета торговли эксперту, если нет надлежащего для его расчётов числа баров.


Заключение

Вот, собственно говоря, и весь перечень максимально востребованных функций файла Lite_EXPERT2.mqh, минимально достаточный для удобного и высокопроизводительного труда по написанию торговых стратегий на языке MQL4. В следующих статьях этого цикла я приведу конкретные примеры по применению функций этого файла в экспертах.

Прикрепленные файлы |
Lite_EXPERT2.mqh (185.51 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (6)
[Удален] | 4 июн. 2009 в 08:25
Николай, спасибо огромное за файл. Предыдущий файл приходилось корректировать под свои нужды, а в этом все учтено. Но у меня одна проблема - не получается приинклюдить этот файл к своим советникам, видимо еще не хватает опыта. Был бы очень признателен, если вы вложите пример советника, работающего с Lite_EXPERT2. Заранее спасибо.
[Удален] | 13 июл. 2009 в 21:31

Хорошее подспорье.

Правда, при использовании, обнаружилась ошибка в процедуре CloseAllSellOrders1_ (стр.2893 примерно))) ):

Строку if (!CloseBuyOrder1_(CloseStop_, OrderMagicNumber())) нужно исправить на if (!CloseSellOrder1_(CloseStop_, OrderMagicNumber()))

[Удален] | 24 июл. 2009 в 16:06

Да, автору спасибо.

Громадный труд.

Еще одна ошибочка:

В функции Make_SellTrailingStop_ 

строка if(TRAILINGSTOP <= 0)

нужно if(TRAILINGSTOP <= 0 || !TrailSignal)

robualdo
robualdo | 24 окт. 2011 в 12:22

Hello....Is there any chance to view this article (and attachments) translated in english?

I've read all the previous articles from Nikolay .... he always made great jobs.

Thanks.

Alexandr Gavrilin
Alexandr Gavrilin | 15 апр. 2015 в 21:26
классами бы это все выглядело лучше, все таки язык развивается, надо ООП использовать.
Визуальная оптимизация прибыльности индикаторов и сигналов Визуальная оптимизация прибыльности индикаторов и сигналов
Эта работа – продолжение и развитие моей предыдущей статьи "Визуальное тестирование прибыльности индикаторов и сигналов". Добавив немного интерактивности в процесс изменения параметров и изменив цели исследования, удалось получить новый инструмент, который не просто показывает, какие будут результаты торговли по используемым сигналам, но и позволит, передвигая виртуальные ползунки-регуляторы значений параметров сигналов на основном графике, сразу же получить и раскладку по сделкам, и график изменения баланса, и конечный результат торговли.
Графическое управление внешними параметрами индикаторов Графическое управление внешними параметрами индикаторов
Управление внешними переменными индикаторов вызывается специальным окном, в котором мы меняем параметры и вновь запускаем индикатор. Неудобство таких манипуляций очевидно, поэтому возникла потребность вынести на экран нужные параметры и сделать графическое управление индикатором.
Тестирование и оптимизация советников Тестирование и оптимизация советников
В статье описан процесс тестирования и оптимизации советников в тестере торговой платформы МТ4. Необходимость и востребованность такого рода материала назрела давно. Многие начинающие посетители форума плохо представляют себе суть и последовательность действий при работе с экспертами. Предлагаемая статья дает им возможность чуть более профессионально подойти к делу.
Тестирование экспертов на нестандартных таймфреймах Тестирование экспертов на нестандартных таймфреймах
Это не только просто, это очень просто. Тестирование Советников на нестандартных периодах возможно! Для этого всего лишь достаточно заменить данные стандартного таймфрейма данными нестандартного таймфрейма. Более того, возможно даже тестировать экспертов, пользующихся данными нескольких нестандартных периодов.