//+------------------------------------------------------------------+ //| exp_iCustom_v5.mq4 | //| * | //| * | //+------------------------------------------------------------------+ #property copyright "Integer" #property link "for-good-letters@yandex.ru" /* v5 Изменен тип переменных _O_M3_BuyLevel, _O_M3_SellLevel, _C_M3_CloseBuyLevel, _C_M3_CloseSellLevel, с int на double, для возможности вводить дробные числа. */ /* v4 Добавлена работа отложенными ордерами. Добавлены строковые разделители разделов с переменными в окне свойств. Выбор типа ордеров выполняется переменной OrdType: 0 - рыночные, 1 - стоп, 2 - лимит (переменная находится в разделе "Ордер"). Добавлен раздел переменных "Отложенные ордера" для управления работой отложенными ордерами: PendLevel - уровень установки отложенного ордера от текущй рыночной цены PendPromPrice - цена установки отложенного ордера отсчитывается от цены нулевого бара, при значении PendPromPrice=0 - от цены закрытия (соответствует текущей рыночной цене), 1 - от цены открытия бара PendNewSigMode - способ управления отложенным ордером по новому торговому сигнайлу: 0 - если ордер уже был установлен, то при появлении нового торгового сигнала не выполняются ни какие действия, 1 - переустановка ордера по новому сигналу, 2 - по новому сигналу ордер переустанавливается на "лучший уровень" - байстоп только вниз, байлимит только вверх, селлстоп только вверх, селлимит только вниз. PendPriceFollow - режим следования за ценой. ордер модифицируется при каждом изменении цены определнной переменной PendPromPrice, ордер переустанавливается только на "лучшую цену" (см. описание переменной PendNewSigMode) PendDelete - удаление отложенного ордера по противопоожному торговому сигналу. При значении false, возможно одновременной существование двух отложенных ордеров разного направления. PendExpiration - срок существания ордера в минутах (минимальное значение 11 минут) */ /* v3 Добавлен еще один режим _O_Mode (и _С_Mode) Режим 4 - Экстремум по трем точкам. Используется одна линия индикатора. Номер буфера указывается в переменной _O_M4_iBufIndex (или _С_M4_iBufIndex в блоке закрытия). */ /* v2 1. Добавлена возможность использования разных индикаторов для сигналов открытия и закрытия. Параметры индикатора открытия начинаются с перфикса _O_, индиктора закрытия - с перфикса _C_. Может быть три режима использования индикаторов открытия и закрытия (устанавливается переменной _OС_Mode). Режим 1 - для закрытия индикатор не используются. Возможно закрытия только по стоплосс и тейкпрофит. Режим 2 - индикатор закрытия не используется. Кроме закрытия по стоплосс и тейкпрофит выполняется закрытия противопложных ордеров по сигналам открытия. Стоплосс и тейкпрофит могут быть отключены - надо ввести значение 0 в переменные StopLoss и/или TakeProfit (это касается всех режимов). Режим 3 - Используются отдельные сигналы закрытия по индикатору закрытия (_C_). В этом режиме можно использовать дополнительный режим копирования параметров индикатора открытия в пареметры индиктора закрытия (переменная _C_UseOpenParam), при этом копируется имя индикатора и его параметры. Этот режим сделан для индикаторов генерирущих сигналы открытия и закрытия для ускорения оптимизации (оптимизируемые параметры также копируются). 2. Могут использоваться не только индикаторы со стрелками, но и индикаторы с линиями. Может использоваться две линии (пересечение главной и сигнальной) и одна линия - ее пересечение с уровнями. Для выбора типа индикатора используется переменная _O_Mode (и _С_Mode в блоке закрытия). Режим 1 - индикатор рисует стрелки. Для указания номеров буферов используются переменные _O_M1_iBuyBufIndex и _O_M1_iSellBufIndex, а в блоке закрытия - _C_M1_iCloseBuyBufIndex и _C_M1_iCloseSellBufIndex. Режим 2 - используются главная и сигнальная линии индикатора. Если главная линия пересекает сигнальную снизу вверх - сигнал открытия Buy или закрытия Sell. Для указания буферов используются переменные _O_M2_iMainBufIndex, _O_M2_iSignalBufIndex и _C_M2_iMainBufIndex, _C_M2_iSignalBufIndex. Режим 3 - используется одна линия индикатора. Номер буфера указывается в переменной _O_M3_iBufIndex (или _С_M3_iBufIndex в блоке закрытия). Для указания значения уровней используются переменные _O_M3_BuyLevel и _O_M3_SellLevel (_O_M3_CloseBuyLevel и _C_M3_CloseSellLevel в блоке закрытия). Пересечение уровня Buy снизу вверх - покупка, уровня Sell сверху вниз - продажа. */ /* v1 Эксперт предназначен для работы с любым Custom индиктором, за исключением индикаторов со строковыми параметрами. Возможна оптимизация 5-и параметров индикатора. */ extern int TimeFrame=0; // рабочий таймфрейм эксперта: 0 - таймфрейм графика на котором работает эксперт или который выбран в тестере. Или конкретное значение 1,5,15,30,60,240,1440... extern string s0="==== Индикатор для открытия (Mode: 1 - стрелки, 2 - главная и сигнальная, 3 - линия и уровни, 4 - экстремум) ===="; extern int _O_Mode=1; // 1-индикатор рисует стрелки, открытие по стрелкам, 2-у индикатора главная и сигнальная линия, открытие при пересечение линий, 3-используется одна линия и ее пересечение с уровнями extern string _O_iCustomName="введите имя индикатора"; // имя Custom индикатора extern string _O_iCustomParam="введите список параметров через разделитель /"; // список параметров через разделитель "/". Для переменных типа bool вместо начения true используется 1, вместо false - 0. Если в параметрах индикатора ест строковые переменные, эксперт работать не будет!!! extern int _O_M1_iBuyBufIndex=0; // индекс буфера со стрелками на покупку extern int _O_M1_iSellBufIndex=1; // индекс буфера со стрелками на продажу extern int _O_M2_iMainBufIndex=0; // индекс буфера главной линии extern int _O_M2_iSignalBufIndex=1; // индекс буфера сигнальной линии extern int _O_M3_iBufIndex=0; // индекс буфера линии extern double _O_M3_BuyLevel=20; // уровень попкупки (пересечение снизу вверх) extern double _O_M3_SellLevel=80; // уровень продажи (пересечение сверху вниз) extern int _O_M4_iBufIndex=0; // индекс буфера линии extern int _O_iShift=1; // сдвиг индикатора. 1 - на сформированных барах, 0 - на формирующемся баре (не рекомендуется). Также может быть ведено значение 2,3,4... extern bool _O_Opt_1_Use=false; // включения использования оптимизируемой переменной 1. При включении оптимизируемой переменной вместо значения из строки iCustomParam, определяемого переменной Opt_X_Index будет использоваться значение переменной Opt_X_Value extern int _O_Opt_1_Index=0; // индекс оптимизируемой переменной 1 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _O_Opt_1_Value=0; // значение оптимизируемой переменной 1 extern bool _O_Opt_2_Use=false; // включения использования оптимизируемой переменной 2 extern int _O_Opt_2_Index=0; // индекс оптимизируемой переменной 2 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _O_Opt_2_Value=0; // значение оптимизируемой переменной 2 extern bool _O_Opt_3_Use=false; // включения использования оптимизируемой переменной 3 extern int _O_Opt_3_Index=0; // индекс оптимизируемой переменной 3 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _O_Opt_3_Value=0; // значение оптимизируемой переменной 3 extern bool _O_Opt_4_Use=false; // включения использования оптимизируемой переменной 4 extern int _O_Opt_4_Index=0; // индекс оптимизируемой переменной 4 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _O_Opt_4_Value=0; // значение оптимизируемой переменной 4 extern bool _O_Opt_5_Use=false; // включения использования оптимизируемой переменной 5 extern int _O_Opt_5_Index=0; // индекс оптимизируемой переменной 5 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _O_Opt_5_Value=0; // значение оптимизируемой переменной 5 extern string s1="==== == (_OС_Mode: 1 - по sl и tp, 2 - разворот, 3 - _С_...) == ===="; extern int _OС_Mode=1; // 1-закрытие по стоплосс и тейкпрофит, 2-перед открытием закрываются противопложные ордера по сигналам открытия индикатора _O_, 3-используются сигналы закрытия индикатора _C_ extern string s2="==== Индикатор для закрытия (Mode: 1 - стрелки, 2 - главная и сигнальная, 3 линия и уровни, 4 экстремум) ===="; extern int _C_Mode=1; // 1-индикатор рисует стрелки, открытие по стрелкам, 2-у индикатора главная и сигнальная линия, открытие при пересечение линий, 3-используется одна линия и ее пересечение с уровнями extern bool _C_UseOpenParam=false; // копировать все параметры с индикатра открытия (также и имя индиктаора). Сделано на случай использования индиктора со стрелками открытия и стрелками закрытия, с таким индикатором достаточно установить _C_UseOpenParam=true и указать номера буферов _C_M1_..., _C_M2_..., _C_M3_... и установить режим _C_Mode (например на открытие используются стрелки, а на закрытие пересечение линий) extern string _C_iCustomName="введите имя индикатора"; // имя Custom индикатора extern string _C_iCustomParam="введите список параметров через разделитель /"; // список параметров через разделитель "/". Для переменных типа bool вместо начения true используется 1, вместо false - 0. Если в параметрах индикатора ест строковые переменные, эксперт работать не будет!!! extern int _C_M1_iCloseBuyBufIndex=0; // индекс буфера со стрелками на покупку extern int _C_M1_iCloseSellBufIndex=1; // индекс буфера со стрелками на продажу extern int _C_M2_iMainBufIndex=0; // индекс буфера главной линии extern int _C_M2_iSignalBufIndex=1; // индекс буфера сигнальной линии extern int _C_M3_iBufIndex=0; // индекс буфера линии extern double _C_M3_CloseBuyLevel=80; // уровень закрытия попкупки (пересечение сверху вниз) extern double _C_M3_CloseSellLevel=20; // уровень закрытия продажи (пересечение снизу вверх) extern int _C_M4_iBufIndex=0; // индекс буфера линии extern int _C_iShift=1; // сдвиг индикатора. 1 - на сформированных барах, 0 - на формирующемся баре (не рекомендуется). Также может быть ведено значение 2,3,4... extern bool _C_Opt_1_Use=false; // включения использования оптимизируемой переменной 1. При включении оптимизируемой переменной вместо значения из строки iCustomParam, определяемого переменной Opt_X_Index будет использоваться значение переменной Opt_X_Value extern int _C_Opt_1_Index=0; // индекс оптимизируемой переменной 1 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _C_Opt_1_Value=0; // значение оптимизируемой переменной 1 extern bool _C_Opt_2_Use=false; // включения использования оптимизируемой переменной 2 extern int _C_Opt_2_Index=0; // индекс оптимизируемой переменной 2 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _C_Opt_2_Value=0; // значение оптимизируемой переменной 2 extern bool _C_Opt_3_Use=false; // включения использования оптимизируемой переменной 3 extern int _C_Opt_3_Index=0; // индекс оптимизируемой переменной 3 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _C_Opt_3_Value=0; // значение оптимизируемой переменной 3 extern bool _C_Opt_4_Use=false; // включения использования оптимизируемой переменной 4 extern int _C_Opt_4_Index=0; // индекс оптимизируемой переменной 4 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _C_Opt_4_Value=0; // значение оптимизируемой переменной 4 extern bool _C_Opt_5_Use=false; // включения использования оптимизируемой переменной 5 extern int _C_Opt_5_Index=0; // индекс оптимизируемой переменной 5 в массиве параметров (в строке iCustomParam). Отсчет начинается с нуля. extern double _C_Opt_5_Value=0; // значение оптимизируемой переменной 5 extern string s3="=== Определение размера лота ==="; extern int MMMethod=0; // метод ММ: 0-Lots, 1-часть (Risk) от свободных средств, 2-часть (Risk) от свободных средств нормированных по значению MeansStep (например Risk=0.1, MeansStep=1000, если средств меньше 2000, лот равен 0.1, если средств стало 2000 или более - 0.2 лота, 3000 и более - 0.3 лота и т.д. ) extern double Lots=0.1; // количестов лотов при MMMethod=0 extern double Risk=0.1; // риск. Величина от средств при FixedLot=false extern int MeansType=3; // тип средств используемых при расчете размера лота. 1 - Balance, 2 - Equity, 3 - FreeMargin extern double MeansStep=1000; // шаг средств. Используется при MMMethod=2 extern int LotsDigits=1; // Количество знаков после запятой у размера лота extern string s4="=== Ордер (OrdType: 0-Market, 1-Stop, 2-Limit) ==="; extern int OrdType=0; // тип ордеров: 0 - рыночные, 1 - стоп, 2 - лимит. Для типов 1 и 2 см. переменные extern int Slippage=3; // допустимое отклонение от запрошенной цены extern int StopLoss=25; // стоплосс extern int TakeProfit=25; // тейкпрофит extern int SleepBars=1; // таймаут после открытия ордера в количестве баров рабочего таймфрейма extern bool CancelSleeping=true; // включение отмены таймаута при открытии ордера противоположного направления. extern int Magic_N=96778; // магик extern string s41="---- ---- Отложенные ордера (PendNewSigMode: 1-нет переустановки, 2-простая переустановка, 3-переустановка на лучший уровень) ---- ----"; extern int PendLevel=20; // уровень установки отложенного ордера от текущй рыночной цены extern int PendPromPrice=1; // цена установки отложенного ордера отсчитывается от цены нулевого бара, при значении PendPromPrice=0 - от цены закрытия (соответствует текущей рыночной цене), 1 - от цены открытия бара extern int PendNewSigMode=2; // способ управления отложенным ордером по новому торговому сигнайлу: ордера. 0 - если ордер уже был установлен, то при появлении нового торгового сигнала не выполняются ни какие действия, 1 - переустановка ордера по новому сигналу, 2 - по новому сигналу ордер переустанавливается на "лучший уровень" - байстоп только вниз, байлимит только вверх, селлстоп только вверх, селлимит только вниз extern bool PendPriceFollow=false; // режим следования за ценой. ордер модифицируется при каждом изменении цены определнной переменной PendPromPrice, ордер переустанавливается только на "лучшую цену" (см. описание переменной PendNewSigMode) extern bool PendDelete=true; // удаление отложенного ордера по противопоожному торговому сигналу. При значении false, возможно одновременной существование двух ордеров разного направления extern int PendExpiration=0; // срок существания ордера в минутах (минимальное значение 11 минут) extern string s42="---- ---- Учет рыночных ордеров ---- ----"; extern int MaxOrdersCount=-1; // допустимое общее количество открытых ордеров. -1 - не ограничено extern int MaxBuyCount=-1; // допустимое количество открытых ордеров buy. -1 - не огрничено extern int MaxSellCount=-1; // допустимое количество открытых ордеров sell. -1 - не огрничено extern string s5="=== Трейлинг ==="; extern bool TrailingStop_Use=false; // включение функции трейлингстопа extern int TrailingStopStart=50; // прибыль ордера при которой начинает работать трейлингстоп extern int TrailingStop=15; // уровень трейлингстопа extern string s6="=== Безубыток ==="; extern bool BreakEven_Use=false; // включение функции безубытка extern int BreakEvenStart=30; // прибыль ордера при которой срабатывает безубыток extern int BreakEvenLevel=15; // уровень на который устанавливается стоплосс от цены срабатывания безубытка double _O_ParArr[]; double _C_ParArr[]; int LastBuyTime,LastSellTime; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- if(TimeFrame==0)TimeFrame=Period(); fSplitStrToDouble(_O_iCustomParam,_O_ParArr,"/"); if(_O_Opt_1_Use){ if(_O_Opt_1_IndexLastSellTime)LastSellTime=0; if(LastSellTime>LastBuyTime)LastBuyTime=0; LastBuyTime=TimeFrame*60*MathFloor(LastBuyTime/(TimeFrame*60)); LastSellTime=TimeFrame*60*MathFloor(LastSellTime/(TimeFrame*60)); ft=true; } bool BuySignal=false; bool SellSignal=false; bool TestMode=true; switch (_O_Mode){ case 1: double buyarrow=fGetCustomValue(TimeFrame,_O_iCustomName,_O_M1_iBuyBufIndex,_O_ParArr,_O_iShift); double sellarrow=fGetCustomValue(TimeFrame,_O_iCustomName,_O_M1_iSellBufIndex,_O_ParArr,_O_iShift); BuySignal=(buyarrow!=EMPTY_VALUE && buyarrow!=0); SellSignal=(sellarrow!=EMPTY_VALUE && sellarrow!=0); break; case 2: double main_1=fGetCustomValue(TimeFrame,_O_iCustomName,_O_M2_iMainBufIndex,_O_ParArr,_O_iShift); double signal_1=fGetCustomValue(TimeFrame,_O_iCustomName,_O_M2_iSignalBufIndex,_O_ParArr,_O_iShift); double main_2=fGetCustomValue(TimeFrame,_O_iCustomName,_O_M2_iMainBufIndex,_O_ParArr,_O_iShift+1); double signal_2=fGetCustomValue(TimeFrame,_O_iCustomName,_O_M2_iSignalBufIndex,_O_ParArr,_O_iShift+1); BuySignal=(main_1>signal_1 && !(main_2>signal_2)); SellSignal=(main_1_O_M3_BuyLevel && !(line_2>_O_M3_BuyLevel)); SellSignal=(line_1<_O_M3_SellLevel && !(line_2<_O_M3_SellLevel)); break; case 4: line_1=fGetCustomValue(TimeFrame,_O_iCustomName,_O_M4_iBufIndex,_O_ParArr,_O_iShift); line_2=fGetCustomValue(TimeFrame,_O_iCustomName,_O_M4_iBufIndex,_O_ParArr,_O_iShift+1); double line_3=fGetCustomValue(TimeFrame,_O_iCustomName,_O_M3_iBufIndex,_O_ParArr,_O_iShift+2); BuySignal=(line_1>line_2 && line_3>line_2); SellSignal=(line_1signal_1 && !(main_2>signal_2)); CloseBuySignal=(main_1_C_M3_CloseSellLevel && !(line_2>_C_M3_CloseSellLevel)); CloseBuySignal=(line_1<_C_M3_CloseBuyLevel && !(line_2<_C_M3_CloseBuyLevel)); break; case 4: line_1=fGetCustomValue(TimeFrame,_C_iCustomName,_C_M4_iBufIndex,_C_ParArr,_C_iShift); line_2=fGetCustomValue(TimeFrame,_C_iCustomName,_C_M4_iBufIndex,_C_ParArr,_C_iShift+1); line_3=fGetCustomValue(TimeFrame,_C_iCustomName,_C_M4_iBufIndex,_C_ParArr,_C_iShift+2); CloseSellSignal=(line_1>line_2 && line_3>line_2); CloseBuySignal=(line_1=LastBuyTime+TimeFrame*60*SleepBars){ fOrderOpenBuy(); } break; case 1: // Buy Stop if(BuyStopCount==0){ // установка if(iTime(NULL,TimeFrame,0)>=LastBuyTime+TimeFrame*60*SleepBars){ double OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)+Point*PendLevel+(Ask-Bid); datetime Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fOrderSetBuyStop(OpPrice,Expir); } } else{ // модификация if(BuyStopTicket>0){ switch(PendNewSigMode){ case 1: // простая if(iTime(NULL,TimeFrame,0)>=LastBuyTime+TimeFrame*60*SleepBars){ if(OrderSelect(BuyStopTicket,SELECT_BY_TICKET)){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)+Point*PendLevel+(Ask-Bid); if(ND(OpPrice)!=ND(OrderOpenPrice())){ Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fModifyBuyStop(OrderTicket(),OpPrice,Expir); } } } break; case 2: // на лучшую цену if(OrderSelect(BuyStopTicket,SELECT_BY_TICKET)){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)+Point*PendLevel+(Ask-Bid); if(ND(OpPrice)=LastBuyTime+TimeFrame*60*SleepBars){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)-Point*PendLevel+(Ask-Bid); Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fOrderSetBuyLimit(OpPrice,Expir); } } else{ // модификация if(BuyLimitTicket>0){ switch(PendNewSigMode){ case 1: // простая if(iTime(NULL,TimeFrame,0)>=LastBuyTime+TimeFrame*60*SleepBars){ if(OrderSelect(BuyLimitTicket,SELECT_BY_TICKET)){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)-Point*PendLevel+(Ask-Bid); if(ND(OpPrice)!=ND(OrderOpenPrice())){ Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fModifyBuyLimit(OrderTicket(),OpPrice,Expir); } } } break; case 2: // на лучшую цену if(OrderSelect(BuyLimitTicket,SELECT_BY_TICKET)){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)-Point*PendLevel+(Ask-Bid); if(ND(OpPrice)>ND(OrderOpenPrice())){ Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fModifyBuyLimit(OrderTicket(),OpPrice,Expir); } } break; } } } break; } } } if(SellSignal){ if(SellCount=LastSellTime+TimeFrame*60*SleepBars){ fOrderOpenSell(); } break; case 1: // Sell Stop if(SellStopCount==0){ // установка if(iTime(NULL,TimeFrame,0)>=LastSellTime+TimeFrame*60*SleepBars){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)-Point*PendLevel; Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fOrderSetSellStop(OpPrice,Expir); } } else{ // модификация if(SellStopTicket>0){ switch(PendNewSigMode){ case 1: // простая if(iTime(NULL,TimeFrame,0)>=LastSellTime+TimeFrame*60*SleepBars){ if(OrderSelect(SellStopTicket,SELECT_BY_TICKET)){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)-Point*PendLevel; if(ND(OpPrice)!=ND(OrderOpenPrice())){ Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fModifySellStop(OrderTicket(),OpPrice,Expir); } } } break; case 2: // на лучшую цену if(OrderSelect(SellStopTicket,SELECT_BY_TICKET)){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)-Point*PendLevel; if(ND(OpPrice)>ND(OrderOpenPrice())){ Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fModifySellStop(OrderTicket(),OpPrice,Expir); } } break; } } } break; case 2: // Sell Limit if(SellLimitCount==0){ // установка if(iTime(NULL,TimeFrame,0)>=LastSellTime+TimeFrame*60*SleepBars){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)+Point*PendLevel; Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fOrderSetSellLimit(OpPrice,Expir); } } else{ // модификация if(SellLimitTicket>0){ switch(PendNewSigMode){ case 1: if(iTime(NULL,TimeFrame,0)>=LastSellTime+TimeFrame*60*SleepBars){ if(OrderSelect(SellLimitTicket,SELECT_BY_TICKET)){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)+Point*PendLevel; if(ND(OpPrice)!=ND(OrderOpenPrice())){ Expir=0; if(PendExpiration!=0)Expir=TimeCurrent()+PendExpiration*60; fModifySellLimit(OrderTicket(),OpPrice,Expir); } } } break; case 2: if(OrderSelect(SellLimitTicket,SELECT_BY_TICKET)){ OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)+Point*PendLevel; if(ND(OpPrice)=0;i--){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N){ switch (OrderType()){ case OP_BUYSTOP: double OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)+Point*PendLevel+(Ask-Bid); if(ND(OpPrice)ND(OrderOpenPrice())){ fModifySellStop(OrderTicket(),OpPrice,OrderExpiration()); } break; case OP_BUYLIMIT: OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)-Point*PendLevel+(Ask-Bid); if(ND(OpPrice)>ND(OrderOpenPrice())){ fModifyBuyLimit(OrderTicket(),OpPrice,OrderExpiration()); } break; case OP_SELLLIMIT: OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)+Point*PendLevel; OpPrice=iMA(NULL,TimeFrame,1,0,0,PendPromPrice,0)-Point*PendLevel+(Ask-Bid); if(ND(OpPrice)0){ if(!IsTradeContextBusy()){ double slts=ND(Ask-Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(Ask+Point*TakeProfit); if(TakeProfit==0)tpts=0; int irv=OrderSend(Symbol(),OP_BUY,lts,ND(Ask),Slippage,slts,tpts,NULL,Magic_N,0,CLR_NONE); if(irv>0){ LastBuyTime=iTime(NULL,TimeFrame,0); if(CancelSleeping)LastSellTime=0; return(irv); } else{ Print ("Error open BUY. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(lt2!=iTime(NULL,TimeFrame,0)){ lt2=iTime(NULL,TimeFrame,0); Print("Need open buy. Trade Context Busy"); } return(-2); } } else{ static int lt3=0; if(lt3!=iTime(NULL,TimeFrame,0)){ lt3=iTime(NULL,TimeFrame,0); if(lts==-1)Print("Need open buy. No money"); if(lts==-2)Print("Need open buy. Wrong lots size"); } return(-3); } } int fOrderOpenSell(){ RefreshRates(); double lts=fGetLotsSimple(OP_SELL); if(lts>0){ if(!IsTradeContextBusy()){ double slts=ND(Bid+Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(Bid-Point*TakeProfit); if(TakeProfit==0)tpts=0; int irv=OrderSend(Symbol(),OP_SELL,lts,ND(Bid),Slippage,slts,tpts,NULL,Magic_N,0,CLR_NONE); if(irv>0){ LastSellTime=iTime(NULL,TimeFrame,0); if(CancelSleeping)LastBuyTime=0; return(irv); } else{ Print ("Error open SELL. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(lt2!=iTime(NULL,TimeFrame,0)){ lt2=iTime(NULL,TimeFrame,0); Print("Need open sell. Trade Context Busy"); } return(-2); } } else{ static int lt3=0; if(lt3!=iTime(NULL,TimeFrame,0)){ lt3=iTime(NULL,TimeFrame,0); if(lts==-1)Print("Need open sell. No money"); if(lts==-2)Print("Need open sell. Wrong lots size"); } return(-3); } } string fMyErDesc(int aErrNum){ string pref="Err Num: "+aErrNum+" - "; switch(aErrNum){ case 0: return(pref+"NO ERROR"); case 1: return(pref+"NO RESULT"); case 2: return(pref+"COMMON ERROR"); case 3: return(pref+"INVALID TRADE PARAMETERS"); case 4: return(pref+"SERVER BUSY"); case 5: return(pref+"OLD VERSION"); case 6: return(pref+"NO CONNECTION"); case 7: return(pref+"NOT ENOUGH RIGHTS"); case 8: return(pref+"TOO FREQUENT REQUESTS"); case 9: return(pref+"MALFUNCTIONAL TRADE"); case 64: return(pref+"ACCOUNT DISABLED"); case 65: return(pref+"INVALID ACCOUNT"); case 128: return(pref+"TRADE TIMEOUT"); case 129: return(pref+"INVALID PRICE"); case 130: return(pref+"INVALID STOPS"); case 131: return(pref+"INVALID TRADE VOLUME"); case 132: return(pref+"MARKET CLOSED"); case 133: return(pref+"TRADE DISABLED"); case 134: return(pref+"NOT ENOUGH MONEY"); case 135: return(pref+"PRICE CHANGED"); case 136: return(pref+"OFF QUOTES"); case 137: return(pref+"BROKER BUSY"); case 138: return(pref+"REQUOTE"); case 139: return(pref+"ORDER LOCKED"); case 140: return(pref+"LONG POSITIONS ONLY ALLOWED"); case 141: return(pref+"TOO MANY REQUESTS"); case 145: return(pref+"TRADE MODIFY DENIED"); case 146: return(pref+"TRADE CONTEXT BUSY"); case 147: return(pref+"TRADE EXPIRATION DENIED"); case 148: return(pref+"TRADE TOO MANY ORDERS"); //---- mql4 run time errors case 4000: return(pref+"NO MQLERROR"); case 4001: return(pref+"WRONG FUNCTION POINTER"); case 4002: return(pref+"ARRAY INDEX OUT OF RANGE"); case 4003: return(pref+"NO MEMORY FOR FUNCTION CALL STACK"); case 4004: return(pref+"RECURSIVE STACK OVERFLOW"); case 4005: return(pref+"NOT ENOUGH STACK FOR PARAMETER"); case 4006: return(pref+"NO MEMORY FOR PARAMETER STRING"); case 4007: return(pref+"NO MEMORY FOR TEMP STRING"); case 4008: return(pref+"NOT INITIALIZED STRING"); case 4009: return(pref+"NOT INITIALIZED ARRAYSTRING"); case 4010: return(pref+"NO MEMORY FOR ARRAYSTRING"); case 4011: return(pref+"TOO LONG STRING"); case 4012: return(pref+"REMAINDER FROM ZERO DIVIDE"); case 4013: return(pref+"ZERO DIVIDE"); case 4014: return(pref+"UNKNOWN COMMAND"); case 4015: return(pref+"WRONG JUMP"); case 4016: return(pref+"NOT INITIALIZED ARRAY"); case 4017: return(pref+"DLL CALLS NOT ALLOWED"); case 4018: return(pref+"CANNOT LOAD LIBRARY"); case 4019: return(pref+"CANNOT CALL FUNCTION"); case 4020: return(pref+"EXTERNAL EXPERT CALLS NOT ALLOWED"); case 4021: return(pref+"NOT ENOUGH MEMORY FOR RETURNED STRING"); case 4022: return(pref+"SYSTEM BUSY"); case 4050: return(pref+"INVALID FUNCTION PARAMETERS COUNT"); case 4051: return(pref+"INVALID FUNCTION PARAMETER VALUE"); case 4052: return(pref+"STRING FUNCTION INTERNAL ERROR"); case 4053: return(pref+"SOME ARRAY ERROR"); case 4054: return(pref+"INCORRECT SERIES ARRAY USING"); case 4055: return(pref+"CUSTOM INDICATOR ERROR"); case 4056: return(pref+"INCOMPATIBLE ARRAYS"); case 4057: return(pref+"GLOBAL VARIABLES PROCESSING ERROR"); case 4058: return(pref+"GLOBAL VARIABLE NOT FOUND"); case 4059: return(pref+"FUNCTION NOT ALLOWED IN TESTING MODE"); case 4060: return(pref+"FUNCTION NOT CONFIRMED"); case 4061: return(pref+"SEND MAIL ERROR"); case 4062: return(pref+"STRING PARAMETER EXPECTED"); case 4063: return(pref+"INTEGER PARAMETER EXPECTED"); case 4064: return(pref+"DOUBLE PARAMETER EXPECTED"); case 4065: return(pref+"ARRAY AS PARAMETER EXPECTED"); case 4066: return(pref+"HISTORY WILL UPDATED"); case 4067: return(pref+"TRADE ERROR"); case 4099: return(pref+"END OF FILE"); case 4100: return(pref+"SOME FILE ERROR"); case 4101: return(pref+"WRONG FILE NAME"); case 4102: return(pref+"TOO MANY OPENED FILES"); case 4103: return(pref+"CANNOT OPEN FILE"); case 4104: return(pref+"INCOMPATIBLE ACCESS TO FILE"); case 4105: return(pref+"NO ORDER SELECTED"); case 4106: return(pref+"UNKNOWN SYMBOL"); case 4107: return(pref+"INVALID PRICE PARAM"); case 4108: return(pref+"INVALID TICKET"); case 4109: return(pref+"TRADE NOT ALLOWED"); case 4110: return(pref+"LONGS NOT ALLOWED"); case 4111: return(pref+"SHORTS NOT ALLOWED"); case 4200: return(pref+"OBJECT ALREADY EXISTS"); case 4201: return(pref+"UNKNOWN OBJECT PROPERTY"); case 4202: return(pref+"OBJECT DOES NOT EXIST"); case 4203: return(pref+"UNKNOWN OBJECT TYPE"); case 4204: return(pref+"NO OBJECT NAME"); case 4205: return(pref+"OBJECT COORDINATES ERROR"); case 4206: return(pref+"NO SPECIFIED SUBWINDOW"); case 4207: return(pref+"SOME OBJECT ERROR"); default: return(pref+"WRONG ERR NUM"); } } double ND(double v){return(NormalizeDouble(v,Digits));} int fOrdersTotal(int & aBuyCount,int & aSellCount,int & aBuyStopCount,int & aSellStopCount,int & aBuyLimitCount,int & aSellLimitCount,int & aBuyStopTicket,int & aSellStopTicket,int & aBuyLimitTicket,int & aSellLimitTicket){ aBuyCount=0; aSellCount=0; aBuyStopCount=0; aSellStopCount=0; aBuyLimitCount=0; aSellLimitCount=0; aBuyStopTicket=0; aSellStopTicket=0; aBuyLimitTicket=0; aSellLimitTicket=0; for(int i=0;i=0;i--){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N){ if(OrderType()==OP_BUY && aCloseBuy){ RefreshRates(); if(!IsTradeContextBusy()){ if(!OrderClose(OrderTicket(),OrderLots(),ND(Bid),Slippage,CLR_NONE)){ Print("Error close BUY "+OrderTicket()+" "+fMyErDesc(GetLastError())); tErr=-1; } } else{ static int lt1=0; if(lt1!=iTime(NULL,TimeFrame,0)){ lt1=iTime(NULL,TimeFrame,0); Print("Need close BUY "+OrderTicket()+". Trade Context Busy"); } return(-2); } } if(OrderType()==OP_SELL && aCloseSell){ RefreshRates(); if(!IsTradeContextBusy()){ if(!OrderClose(OrderTicket(),OrderLots(),ND(Ask),Slippage,CLR_NONE)){ Print("Error close SELL "+OrderTicket()+" "+fMyErDesc(GetLastError())); tErr=-1; } } else{ static int lt2=0; if(lt2!=iTime(NULL,TimeFrame,0)){ lt2=iTime(NULL,TimeFrame,0); Print("Need close SELL "+OrderTicket()+". Trade Context Busy"); } return(-2); } } } } } return(tErr); } int fOrderDeletePending(bool aDeleteBuy=true,bool aDeleteSell=true){ int tErr=0; for(int i=OrdersTotal()-1;i>=0;i--){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_N){ if((OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT) && aDeleteBuy){ RefreshRates(); if(!IsTradeContextBusy()){ if(!OrderDelete(OrderTicket())){ Print("Error delete order "+OrderTicket()+" "+fMyErDesc(GetLastError())); tErr=-1; } } else{ static int lt1=0; if(lt1!=iTime(NULL,TimeFrame,0)){ lt1=iTime(NULL,TimeFrame,0); Print("Need delete order "+OrderTicket()+". Trade Context Busy"); } return(-2); } } if((OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT) && aDeleteSell){ RefreshRates(); if(!IsTradeContextBusy()){ if(!OrderDelete(OrderTicket())){ Print("Error delete order "+OrderTicket()+" "+fMyErDesc(GetLastError())); tErr=-1; } } else{ static int lt2=0; if(lt2!=iTime(NULL,TimeFrame,0)){ lt2=iTime(NULL,TimeFrame,0); Print("Need delete order "+OrderTicket()+". Trade Context Busy"); } return(-2); } } } } } return(tErr); } int fSplitStrToDouble(string aString,double & aArray[],string aDelimiter){ string tmp_str=""; string tmp_char=""; ArrayResize(aArray,0); for(int i=0;i=ND(Point*BreakEvenStart)){ slts=ND(OrderOpenPrice()+Point*(BreakEvenStart-BreakEvenLevel)); if(ND(OrderStopLoss())=ND(Point*BreakEvenStart)){ slts=ND(OrderOpenPrice()-Point*(BreakEvenStart-BreakEvenLevel)); if(ND(OrderStopLoss())>slts || ND(OrderStopLoss())==0){ if(!IsTradeContextBusy()){ if(!OrderModify(OrderTicket(),OrderOpenPrice(),slts,OrderTakeProfit(),0,CLR_NONE)){ Print("Error breakeven SELL "+OrderTicket()+" "+fMyErDesc(GetLastError())); } } else{ static int lt2=0; if(lt2!=iTime(NULL,TimeFrame,0)){ lt2=iTime(NULL,TimeFrame,0); Print("Need breakeven SELL "+OrderTicket()+". Trade Context Busy"); } } } } } } } } } void fTrailingWithStart(){ double slts; for(int i=0;i=ND(Point*TrailingStopStart)){ slts=ND(Bid-Point*TrailingStop); if(ND(OrderStopLoss())=ND(Point*TrailingStopStart)){ slts=ND(Ask+Point*TrailingStop); if(!IsTradeContextBusy()){ if(ND(OrderStopLoss())>slts || ND(OrderStopLoss())==0){ if(!OrderModify(OrderTicket(),OrderOpenPrice(),slts,OrderTakeProfit(),0,CLR_NONE)){ Print("Error trailingstop SELL "+OrderTicket()+" "+fMyErDesc(GetLastError())); } } } else{ static int lt2=0; if(lt2!=iTime(NULL,TimeFrame,0)){ lt2=iTime(NULL,TimeFrame,0); Print("Need trailingstop SELL "+OrderTicket()+". Trade Context Busy"); } } } } } } } } double fGetCustomValue(int TimeFrame,string aName,int aIndex,double aParArr[],int aShift){ double tv; switch (ArraySize(aParArr)){ case 0: tv=iCustom(NULL,TimeFrame,aName,aIndex,aShift); break; case 1: tv=iCustom(NULL,TimeFrame,aName,aParArr[0],aIndex,aShift); break; case 2: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aIndex,aShift); break; case 3: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aIndex,aShift); break; case 4: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aIndex,aShift); break; case 5: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aIndex,aShift); break; case 6: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aIndex,aShift); break; case 7: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aIndex,aShift); break; case 8: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aIndex,aShift); break; case 9: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aIndex,aShift); break; case 10: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aIndex,aShift); break; case 11: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aIndex,aShift); break; case 12: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aIndex,aShift); break; case 13: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aIndex,aShift); break; case 14: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aIndex,aShift); break; case 15: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aIndex,aShift); break; case 16: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aIndex,aShift); break; case 17: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aIndex,aShift); break; case 18: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aIndex,aShift); break; case 19: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aIndex,aShift); break; case 20: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aIndex,aShift); break; case 21: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aIndex,aShift); break; case 22: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aIndex,aShift); break; case 23: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aIndex,aShift); break; case 24: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aIndex,aShift); break; case 25: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aIndex,aShift); break; case 26: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aIndex,aShift); break; case 27: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aIndex,aShift); break; case 28: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aIndex,aShift); break; case 29: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aIndex,aShift); break; case 30: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aIndex,aShift); break; case 31: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aIndex,aShift); break; case 32: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aIndex,aShift); break; case 33: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aIndex,aShift); break; case 34: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aIndex,aShift); break; case 35: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aIndex,aShift); break; case 36: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aIndex,aShift); break; case 37: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aIndex,aShift); break; case 38: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aIndex,aShift); break; case 39: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aIndex,aShift); break; case 40: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aIndex,aShift); break; case 41: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aIndex,aShift); break; case 42: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aIndex,aShift); break; case 43: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aIndex,aShift); break; case 44: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aIndex,aShift); break; case 45: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aIndex,aShift); break; case 46: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aIndex,aShift); break; case 47: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aIndex,aShift); break; case 48: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aIndex,aShift); break; case 49: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aIndex,aShift); break; case 50: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aIndex,aShift); break; case 51: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aParArr[50], aIndex,aShift); break; case 52: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aParArr[50], aParArr[51], aIndex,aShift); break; case 53: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aParArr[50], aParArr[51], aParArr[52], aIndex,aShift); break; case 54: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aParArr[50], aParArr[51], aParArr[52], aParArr[53], aIndex,aShift); break; case 55: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aParArr[50], aParArr[51], aParArr[52], aParArr[53], aParArr[54], aIndex,aShift); break; case 56: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aParArr[50], aParArr[51], aParArr[52], aParArr[53], aParArr[54], aParArr[55], aIndex,aShift); break; case 57: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aParArr[50], aParArr[51], aParArr[52], aParArr[53], aParArr[54], aParArr[55], aParArr[56], aIndex,aShift); break; case 58: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aParArr[50], aParArr[51], aParArr[52], aParArr[53], aParArr[54], aParArr[55], aParArr[56], aParArr[57], aIndex,aShift); break; case 59: tv=iCustom(NULL,TimeFrame,aName, aParArr[0], aParArr[1], aParArr[2], aParArr[3], aParArr[4], aParArr[5], aParArr[6], aParArr[7], aParArr[8], aParArr[9], aParArr[10], aParArr[11], aParArr[12], aParArr[13], aParArr[14], aParArr[15], aParArr[16], aParArr[17], aParArr[18], aParArr[19], aParArr[20], aParArr[21], aParArr[22], aParArr[23], aParArr[24], aParArr[25], aParArr[26], aParArr[27], aParArr[28], aParArr[29], aParArr[30], aParArr[31], aParArr[32], aParArr[33], aParArr[34], aParArr[35], aParArr[36], aParArr[37], aParArr[38], aParArr[39], aParArr[40], aParArr[41], aParArr[42], aParArr[43], aParArr[44], aParArr[45], aParArr[46], aParArr[47], aParArr[48], aParArr[49], aParArr[50], aParArr[51], aParArr[52], aParArr[53], aParArr[54], aParArr[55], aParArr[56], aParArr[57], aParArr[58], aIndex,aShift); break; } return(tv); } int fOrderSetBuyLimit(double aOpenPrice,datetime aExpiration=0){ // fOrderSetBuyLimit(); RefreshRates(); double oppr=ND(aOpenPrice); double msl=ND(Ask-Point*MarketInfo(Symbol(),MODE_STOPLEVEL)); if(oppr<=msl){ double lts=fGetLotsSimple(OP_BUY); if(lts>0){ if(!IsTradeContextBusy()){ double slts=ND(oppr-Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(oppr+Point*TakeProfit); if(TakeProfit==0)tpts=0; int irv=OrderSend(Symbol(),OP_BUYLIMIT,lts,oppr,Slippage,slts,tpts,NULL,Magic_N,aExpiration,CLR_NONE); if(irv>0){ return(irv); } else{ Print ("Error set BUYLIMIT. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(TimeCurrent()>lt2+20){ lt2=TimeCurrent(); Print("Need set BUYLIMIT. Trade Context Busy"); } return(-2); } } else{ static int lt3=0; if(TimeCurrent()>lt3+20){ lt3=TimeCurrent(); if(lts==-1)Print("Need set BUYLIMIT. No money"); if(lts==-2)Print("Need set BUYLIMIT. Wrong lots size"); } return(-3); } } else{ static int lt4=0; if(TimeCurrent()>lt4+20){ lt4=TimeCurrent(); Print("Need set BUYLIMIT. Wrong price level"); } return(-4); } } int fOrderSetBuyStop(double aOpenPrice,datetime aExpiration=0){ // fOrderSetBuyStop(); RefreshRates(); double oppr=ND(aOpenPrice); double msl=ND(Ask+Point*MarketInfo(Symbol(),MODE_STOPLEVEL)); if(oppr>=msl){ double lts=fGetLotsSimple(OP_BUY); if(lts>0){ if(!IsTradeContextBusy()){ double slts=ND(oppr-Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(oppr+Point*TakeProfit); if(TakeProfit==0)tpts=0; int irv=OrderSend(Symbol(),OP_BUYSTOP,lts,oppr,Slippage,slts,tpts,NULL,Magic_N,aExpiration,CLR_NONE); if(irv>0){ return(irv); } else{ Print ("Error set BUYSTOP. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(TimeCurrent()>lt2+20){ lt2=TimeCurrent(); Print("Need set BUYSTOP. Trade Context Busy"); } return(-2); } } else{ static int lt3=0; if(TimeCurrent()>lt3+20){ lt3=TimeCurrent(); if(lts==-1)Print("Need set BUYSTOP. No money"); if(lts==-2)Print("Need set BUYSTOP. Wrong lots size"); } return(-3); } } else{ static int lt4=0; if(TimeCurrent()>lt4+20){ lt4=TimeCurrent(); Print("Need set BUYSTOP. Wrong price level ",msl," ",Ask); } return(-4); } } int fOrderSetSellLimit(double aOpenPrice,datetime aExpiration=0){ // fOrderSetSellLimit(); RefreshRates(); double oppr=ND(aOpenPrice); double msl=ND(Bid+Point*MarketInfo(Symbol(),MODE_STOPLEVEL)); if(oppr>=msl){ double lts=fGetLotsSimple(OP_SELL); if(lts>0){ if(!IsTradeContextBusy()){ double slts=ND(oppr+Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(oppr-Point*TakeProfit); if(TakeProfit==0)tpts=0; int irv=OrderSend(Symbol(),OP_SELLLIMIT,lts,oppr,Slippage,slts,tpts,NULL,Magic_N,aExpiration,CLR_NONE); if(irv>0){ return(irv); } else{ Print ("Error set SELLLIMIT. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(TimeCurrent()>lt2+20){ lt2=TimeCurrent(); Print("Need set SELLLIMIT. Trade Context Busy"); } return(-2); } } else{ static int lt3=0; if(TimeCurrent()>lt3+20){ lt3=TimeCurrent(); if(lts==-1)Print("Need set SELLLIMIT. No money"); if(lts==-2)Print("Need set SELLLIMIT. Wrong lots size"); } return(-3); } } else{ static int lt4=0; if(TimeCurrent()>lt4+20){ lt4=TimeCurrent(); if(lts==-1)Print("Need set SELLIMIT. Wrong price level"); } return(-4); } } int fOrderSetSellStop(double aOpenPrice,datetime aExpiration=0){ // fOrderSetSellStop(); RefreshRates(); double oppr=ND(aOpenPrice); double msl=ND(Bid-Point*MarketInfo(Symbol(),MODE_STOPLEVEL)); if(oppr<=msl){ double lts=fGetLotsSimple(OP_SELL); if(lts>0){ if(!IsTradeContextBusy()){ double slts=ND(oppr+Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(oppr-Point*TakeProfit); if(TakeProfit==0)tpts=0; int irv=OrderSend(Symbol(),OP_SELLSTOP,lts,oppr,Slippage,slts,tpts,NULL,Magic_N,aExpiration,CLR_NONE); if(irv>0){ return(irv); } else{ Print ("Error set SELLSTOP. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(TimeCurrent()>lt2+20){ lt2=TimeCurrent(); Print("Need set SELLSTOP. Trade Context Busy"); } return(-2); } } else{ static int lt3=0; if(TimeCurrent()>lt3+20){ lt3=TimeCurrent(); if(lts==-1)Print("Need set SELLSTOP. No money"); if(lts==-2)Print("Need set SELLSTOP. Wrong lots size"); } return(-3); } } else{ static int lt4=0; if(TimeCurrent()>lt4+20){ lt4=TimeCurrent(); Print("Need set SELLSTOP. Wrong price level"); } return(-4); } } int fModifyBuyStop(int aTicket,double aOpenPrice,datetime aExpiration=0){ RefreshRates(); double oppr=ND(aOpenPrice); double msl=ND(Ask+Point*MarketInfo(Symbol(),MODE_STOPLEVEL)); if(oppr>=msl){ if(!IsTradeContextBusy()){ double slts=ND(oppr-Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(oppr+Point*TakeProfit); if(TakeProfit==0)tpts=0; bool brv=OrderModify(aTicket,oppr,slts,tpts,aExpiration,CLR_NONE); if(brv){ return(0); } else{ Print ("Error modify BUYSTOP. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(TimeCurrent()>lt2+30){ lt2=TimeCurrent(); Print("Need modify buystop. Trade Context Busy"); } return(-2); } } else{ static int lt4=0; if(TimeCurrent()>lt4+30){ lt4=TimeCurrent(); Print("Need modify buystop. Wrong price level "); } return(-4); } } int fModifySellStop(int aTicket,double aOpenPrice,datetime aExpiration=0){ RefreshRates(); double oppr=ND(aOpenPrice); double msl=ND(Bid-Point*MarketInfo(Symbol(),MODE_STOPLEVEL)); if(oppr<=msl){ if(!IsTradeContextBusy()){ double slts=ND(oppr+Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(oppr-Point*TakeProfit); if(TakeProfit==0)tpts=0; int irv=OrderModify(aTicket,oppr,slts,tpts,aExpiration,CLR_NONE); if(irv>0){ return(irv); } else{ Print ("Error modify SELLSTOP. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(TimeCurrent()>lt2+30){ lt2=TimeCurrent(); Print("Need modify sellstop. Trade Context Busy"); } return(-2); } } else{ static int lt4=0; if(TimeCurrent()>lt4+30){ lt4=TimeCurrent(); Print("Need modify sellstop. Wrong price level"); } return(-4); } } int fModifyBuyLimit(int aTicket,double aOpenPrice,datetime aExpiration=0){ RefreshRates(); double oppr=ND(aOpenPrice); double msl=ND(Ask-Point*MarketInfo(Symbol(),MODE_STOPLEVEL)); if(oppr<=msl){ if(!IsTradeContextBusy()){ double slts=ND(oppr-Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(oppr+Point*TakeProfit); if(TakeProfit==0)tpts=0; bool brv=OrderModify(aTicket,oppr,slts,tpts,aExpiration,CLR_NONE); if(brv){ return(0); } else{ Print ("Error modify BUYLIMIT. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(TimeCurrent()>lt2+30){ lt2=TimeCurrent(); Print("Need modify buylimit. Trade Context Busy"); } return(-2); } } else{ static int lt4=0; if(TimeCurrent()>lt4+30){ lt4=TimeCurrent(); Print("Need modify buylimit. Wrong price level "); } return(-4); } } int fModifySellLimit(int aTicket,double aOpenPrice,datetime aExpiration=0){ RefreshRates(); double oppr=ND(aOpenPrice); double msl=ND(Bid+Point*MarketInfo(Symbol(),MODE_STOPLEVEL)); if(oppr>=msl){ if(!IsTradeContextBusy()){ double slts=ND(oppr+Point*StopLoss); if(StopLoss==0)slts=0; double tpts=ND(oppr-Point*TakeProfit); if(TakeProfit==0)tpts=0; int irv=OrderModify(aTicket,oppr,slts,tpts,aExpiration,CLR_NONE); if(irv>0){ return(irv); } else{ Print ("Error modify SELLLIMIT. "+fMyErDesc(GetLastError())); return(-1); } } else{ static int lt2=0; if(TimeCurrent()>lt2+30){ lt2=TimeCurrent(); Print("Need modify selllimit. Trade Context Busy"); } return(-2); } } else{ static int lt4=0; if(TimeCurrent()>lt4+30){ lt4=TimeCurrent(); Print("Need modify selllimit. Wrong price level"); } return(-4); } }