Вот пример моего кода:
//+------------------------------------------------------------------+ //| Sample.mq5 | #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 0 #include "Includes//Symbol.mqh" input int GO_BACK_HISTORY_LOAD_DAYS = 30; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ string Orignal_Symbol = Symbol(), symbol_custom = Orignal_Symbol + "_P"; int ticks_per_sec, total_len_history = 0, initialization_flag, symbol_history_wiped_clean; datetime Current_DAY; bool alert_once = false; long LastTime_Added = 0, tick_chart_id = -1; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { Close_All_Symbols_Charts(symbol_custom); Current_DAY = iTime(Symbol(), PERIOD_D1, 0); alert_once = false; symbol_history_wiped_clean = Remove_Symbol_From_MarketWatch_Delete_History(symbol_custom); { alert_once = true; initialization_flag = INIT_FAILED; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { ResetLastError(); MqlTick tick, ticks[]; if(symbol_history_wiped_clean == false) { Close_All_Symbols_Charts(symbol_custom); symbol_history_wiped_clean = Remove_Symbol_From_MarketWatch_Delete_History(symbol_custom); if(symbol_history_wiped_clean == false) return 0; } if(symbol_history_wiped_clean == true && initialization_flag == INIT_FAILED ) { Alert_me(); if(Fill_ReFill_Custom_Symbol(symbol_custom) == -1) return 0; initialization_flag = INIT_SUCCEEDED; Print("History Filled Successfully."); Comment(""); return rates_total; } SymbolInfoTick(Orignal_Symbol, tick); datetime Today = iTime(Symbol(), PERIOD_D1, 0); if(Today > Current_DAY) { Current_DAY = Today; LastTime_Added = long(TimeCurrent()) * 1000; } ulong tick_count = tick.time_msc - LastTime_Added; uint get_count = uint(MathAbs(double(tick_count))); int len = CopyTicksRange(Orignal_Symbol, ticks, COPY_TICKS_ALL, LastTime_Added, ulong(TimeCurrent() + PeriodSeconds(PERIOD_D1)) * 1000);//LastTime_Added + 1000 * PeriodSeconds(PERIOD_M1)); if(len <= 0) { return rates_total; } ulong last_time = ticks[len - 1].time_msc; int filled = Tick_Filling_Logic(ticks, len); if(tick_chart_id <= 0) { tick_chart_id = ChartOpen(symbol_custom, PERIOD_CURRENT); } if(ChartSymbol(tick_chart_id) != symbol_custom) { tick_chart_id = ChartOpen(symbol_custom, PERIOD_CURRENT); } return rates_total; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Close_All_Symbols_Charts(string local_symbol) { tick_chart_id = 0; ResetLastError(); Print(" __MQLBUILD__ =", __MQLBUILD__, " __FILE__ =", __FILE__); for(long chartid = ChartFirst(); chartid != -1 && !IsStopped(); chartid = ChartNext(chartid)) { string name = ChartSymbol(chartid); if(StringFind(name, local_symbol) < 0) continue; if(!ChartClose(chartid)) Print("Cannot close Chart Symbol: ", name, " Period: ", EnumToString(ChartPeriod(chartid))); } SymbolSelect(local_symbol, false); Sleep(5000); } bool Remove_Symbol_From_MarketWatch_Delete_History(string local_symbol) { ResetLastError(); const SYMBOL SYMB(local_symbol); bool custom = true; bool status = SYMB.IsExist();//SymbolExist(local_symbol, custom); if(status == false) return true; int Count = 0; while( !IsStopped() && Count < 1000 && SymbolSelect(local_symbol, false) == false )//(SYMB.Off() == false) { if(Count == 0) Print("Cannot UnSelect the Symbol ", local_symbol, " because: ", GetLastError()); for(int i = 0; i < 1000; i++) { Comment("waiting"); } Count++; } Comment(""); if(CustomRatesDelete(local_symbol, 0, TimeCurrent()) < 0) Print("Cannot Delete Custom Rates: ", GetLastError()); if(CustomTicksDelete(local_symbol, 0, TimeCurrent()) < 0) Print("Cannot Delete Custom Ticks: ", GetLastError()); CustomSymbolDelete(local_symbol); return true; } //+------------------------------------------------------------------+ int Fill_ReFill_Custom_Symbol(string local_symbol) { ResetLastError(); total_len_history = 0; alert_once = false; LastTime_Added = 0; Comment("Refreshing the Tick Chart. Please Wait."); MqlDateTime str; TimeToStruct(iTime(Orignal_Symbol, 0, 0) - GO_BACK_HISTORY_LOAD_DAYS * 86400, str); Comment(""); datetime start_date = datetime(StringFormat("%d.%d.01 00:00:00",str.year,str.mon)); const SYMBOL SYMB(local_symbol); SYMB.CloneProperties(Orignal_Symbol); SYMB.SetProperty(SYMBOL_DESCRIPTION, Symbol()); SYMB.SetProperty(SYMBOL_DIGITS, 10); MqlTick ticks_add[]; if(ticks_per_sec <= 0) ticks_per_sec = 1; ulong time_start = GetMicrosecondCount(); ResetLastError(); if(LastTime_Added == 0) LastTime_Added = long(start_date) * 1000; int len = CopyTicksRange(Orignal_Symbol, ticks_add, COPY_TICKS_ALL, LastTime_Added, ulong(TimeCurrent()) * 1000 ); if(len<=0) { string error; if(GetLastError() == 4401) error = "ERR_HISTORY_NOT_FOUND"; else error = string(GetLastError()); Print("------------------------------------------------------------------"); Print("History Tick Length: ", len, " Error: ", error); Print("------------------------------------------------------------------"); Sleep(5000); // Print("Waited for 10000 milliseconds. Still no history found."); return -1; } int total = Tick_Filling_Logic(ticks_add, len); if(total <= 0) { SYMB.Off(); CustomSymbolDelete(local_symbol); //Print("Total = ", total, ". There is no filling of candles yet : ", GetLastError()); return -1; } if(GetLastError() == 4403) { Sleep(2000); Print("History Failed to Retrieve."); len = -1; return len; } Print("Gathering Ticks from : ", iTime(Orignal_Symbol, 0, 0) - GO_BACK_HISTORY_LOAD_DAYS * 86400, " To: ", TimeCurrent()); Print("Symbol Working :",SYMB.On()); Print("Started : ",ticks_add[0].time," Ended : ",ticks_add[len-1].time); Print("Error Found: ",GetLastError()); Print("Ticks Filled: ", total);//SYMB.CloneTicks(ticks_add));//CustomTicksAdd(SYMB.Name,ticks_add));//SYMB.CloneTicks(ticks_add)); Print("Time Required for completion: ",(GetMicrosecondCount()-time_start)/1000000); Print("Started : ",ticks_add[0].time," Ended : ",ticks_add[len-1].time); Print("History Loaded!!!!"); //total_len_history = len; Comment(""); ChartSetString(tick_chart_id, CHART_COMMENT, ""); return len; } //+------------------------------------------------------------------+ void OnDeinit(const int r) { EventKillTimer(); } //+------------------------------------------------------------------+ void Alert_me() { if(alert_once == false) return; Alert(symbol_custom, " : Please Wait for Chart Refresh"); } //+------------------------------------------------------------------+ int Tick_Filling_Logic(MqlTick& ticks_add[], int len) { ResetLastError(); if(IsStopped()) return 0; int total = CustomTicksAdd(symbol_custom, ticks_add); if(total <= 0) { Print("Tick Not added : ", GetLastError()); total = CustomTicksReplace(symbol_custom, ticks_add[0].time_msc, ticks_add[len - 1].time_msc, ticks_add, len); } //if(len > 0) // { // Print(ticks_add[len - 1].time, " ", ticks_add[len - 1].bid, " ", ticks_add[len - 1].time_msc); // } if(total == len) { LastTime_Added = ticks_add[len - 1].time_msc; } else { } MqlTick Tick_check[]; int hh = CopyTicks(symbol_custom, Tick_check, COPY_TICKS_ALL, 0, 10); if(hh > 0) { Print("Filling Ticks ============="); ArrayPrint(ticks_add, _Digits, NULL, (len > 10)? len - 10 : 0, len); Print("Retrieving Ticks ==============="); ArrayPrint(Tick_check, 5, NULL); Print(Tick_check[9].bid, " ", Tick_check[9].bid * 100); MqlTick TT; SymbolInfoTick(symbol_custom, TT); Print(SymbolInfoDouble(symbol_custom, SYMBOL_BID), " ", TT.bid); } return total; } //+------------------------------------------------------------------+ void Restart_the_Whole_Symbol() { } //+------------------------------------------------------------------+
Пожалуйста, проверьте. И это вывод:
Я прикрепил файл Symbol.mqh к этой ветке комментариев.
Я проверил на своём коде, котировки от Мосбиржи, всё работает корректно. Версия метатрейдера 4040.
Другой брокер тоже всё норм. Версия метатрейдера 4048.
код который я вставил в свой советник
MqlTick Tick_check[]; int hh = CopyTicks(c_Name, Tick_check, COPY_TICKS_ALL, 0, 10); if(hh > 0) { Print("Retrieving Ticks ==============="); ArrayPrint(Tick_check, 5, NULL); Print(Tick_check[9].bid, " ", Tick_check[9].bid * 100); MqlTick TT; SymbolInfoTick(c_Name, TT); Print(SymbolInfoDouble(c_Name, SYMBOL_BID), " ", TT.bid); }
результат
(BTCUSDT.fut,M1) Retrieving Ticks =============== (BTCUSDT.fut,M1) [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] (BTCUSDT.fut,M1) [0] 1996.01.02 00:37:41 34369.00000 34369.10000 34370.00000 10 820543061430 30 10.67800 (BTCUSDT.fut,M1) [1] 1996.01.02 00:37:42 34370.00000 34370.10000 34371.40000 12 820543062356 30 12.91900 (BTCUSDT.fut,M1) [2] 1996.01.02 00:37:43 34371.40000 34371.60000 34371.50000 15 820543063129 30 15.54300 (BTCUSDT.fut,M1) [3] 1996.01.02 00:37:43 34371.50000 34371.60000 34372.90000 14 820543063362 30 14.61600 (BTCUSDT.fut,M1) [4] 1996.01.02 00:37:44 34372.90000 34373.00000 34376.50000 1 820543064769 30 1.18700 (BTCUSDT.fut,M1) [5] 1996.01.02 00:37:44 34376.50000 34376.60000 34379.50000 3 820543064970 30 3.37200 (BTCUSDT.fut,M1) [6] 1996.01.02 00:37:45 34379.50000 34379.60000 34379.90000 12 820543065186 30 12.02700 (BTCUSDT.fut,M1) [7] 1996.01.02 00:37:45 34379.90000 34380.00000 34380.60000 16 820543065460 30 16.78500 (BTCUSDT.fut,M1) [8] 1996.01.02 00:37:45 34380.60000 34380.70000 34381.40000 11 820543065769 30 11.67300 (BTCUSDT.fut,M1) [9] 1996.01.02 00:37:46 34381.40000 34381.50000 34384.40000 4 820543066376 30 4.33700 (BTCUSDT.fut,M1) 34381.4 3438140.0 (BTCUSDT.fut,M1) 34380.6 34380.6
Как видите всё норм.
Проблему в вашем коде так же не обнаружил. вроде всё красиво и должно работать правильно.
Какая версия метатрейдера у вас?
Я проверил на своём коде, котировки от Мосбиржи, всё работает корректно. Версия метатрейдера 4040.
Другой брокер тоже всё норм. Версия метатрейдера 4048.
код который я вставил в свой советник
результат
Как видите всё норм.
Проблему в вашем коде так же не обнаружил. вроде всё красиво и должно работать правильно.
Какая версия метатрейдера у вас?
в реальном времени проверил?)
Я все еще получаю ту же проблему. Пожалуйста, любая поддержка MetaQuotes или человек могут посмотреть это, пожалуйста. Я застрял в этой проблеме и не мог двигаться дальше. Я думаю перейти на CTrader или Ninja, если эта проблема останется.
Как тебе помочь если ты не отвечаешь на заданные тебе вопросы?
Проблема у тебя, а не у MetaQuotes, но ты её не пытаешься решить. Устраиваешь истерики и детский шантаж.
Задам вопрос ещё раз. Какая у тебя версия метатрейдера?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, у меня возникла проблема с использованием пользовательского символа, которой раньше у меня не было.
Проблема заключается в получении тиков с помощью функции CopyTicks().
Вот что я заполняю символ BTCUSD:
И вот что я получил, используя функцию копирования тиков:
Значение почти делится на 100, поскольку я думаю, что символ Цифры = 2.
Я пытался проверить, есть ли проблема с моим кодом, но раньше все работало нормально. Эта проблема началась после обновления MT5.
Когда я перезапускаю МТ5, проблема исчезла. И все работает. Но опять же, если я попытаюсь создать собственный символ с другой валютой, у меня возникнет та же проблема. При перезапуске МТ5 проблема повторяется. Но я не могу продолжать перезапускать MT5 во время открытой сделки.
Пожалуйста, дайте решение этой проблемы или хотя бы попросите Metaqotes проверить проблему.