FORTS 助けてください - ページ 12 1...5678910111213141516171819...31 新しいコメント 削除済み 2015.03.28 22:51 #111 komposter: 吐け、エドワード、吐け =) あ、お願いします、「う」でやります))) Anton 2015.03.30 14:49 #112 Mikalas:それはわかるのですが、なぜ上に書いたようなやり方ではダメだったのでしょうか?情報の処理速度に影響を与えることはなかったはずです。ツールに関する情報があれば、それが初めて登場した日付を記録し、メモリに格納する - 8バイト!保存しないこともできますが、SymbolSelect()をすると、メモリに入れることになります。SeriesInfoInteger (SERIES_TERMINAL_FIRSTDATE) 関数でアドレス指定すると、次のようになります。A -1 - データなしБ.0 - データなし、ただし準備中В.A - 最初の情報の日付そうすれば、すべてがクリアで透明なものになるはずです。-1 - サーバーへ行く0 - 次の反復を待って、時系列をチェックおよび/または構築します。> 0 ビルド時系列あなたの言及から、私はあなたがそれをほとんどやったと理解しましたが、そうでないことが判明しました。あるプログラマーが書き始め、別の人が書き終えたらしいあなたの実装はFOREXには向いていますが、FORTSには非常に不都合です。FORTSの場合、相場が長期間来ないこともあり、プラットフォームから時系列をダウンロードする。 というメッセージが表示され、再度、サーバーにログインしてデータを取得するプロセスを繰り返さなければ なりません。Expert Advisorを使えば、複数のシンボルデータを扱うことができ、すべてが便利で簡単になります。MT5環境のインジケーターは、主にその時系列データを素早く計算し、その計算結果をチャート上に表示するものです。プラットフォームの進化に伴い、専門家が利用できる多くの機能を獲得しましたが、基本的なアーキテクチャーの制約は残りました。また、インジケータとEAの違いを完全に排除する理由もありません。繰り返しになりますが、Expert Advisorは独自の処理フローを持っていることが最も重要な違いであると思います。指標はサービスフローで計算され、このフローは他の多くの機能を実行します。そのため、Expert Advisorと共通する機能であっても、実装が異なっています。歴史へのアクセスについては、普遍的な解決策はありません。例えば、Expert Advisorが1つの日付だけを取得したいのか、利用可能な履歴全体を要求したいのか、といったユーザーの要望を端末が事前に予測することはできません。端末は、時間枠の高速アクセスを選択し、すなわち、ユーザの要求に応じて、現在の(サーバと同期した)履歴の状態を完全にキャッシュしようとする。はい、この方法が不便なアプリケーションのクラスがあります。しかし、プログラマーが「個人的に」端末を書き換えるという要求にこだわらなければ、既存の機能の中に解決策を見出すことができるだろう。もし、まったく解決策がないのであれば、そのときだけ機能拡張の問題が出てきます。一般論は抜きにして、具体的な問題を具体的なコードで記述してください。そうでないと、1つの機能が肥大化して「何もかもがおかしい」「何もかもが不便」という、わけのわからない機能になってしまいます。 Mikhail Filimonov 2015.03.30 15:44 #113 antt:Expert Advisor を使って複数のシンボルデータを扱うと、すべてが便利でシンプルになります。MT5環境におけるインジケータは、主にその時系列データに対して高速に計算を行い、その結果をチャート上に表示することを目的として設計されています。プラットフォームの進化に伴い、専門家が利用できる多くの機能を獲得しましたが、基本的なアーキテクチャーの制約は残りました。また、インジケータとEAの違いを完全に排除する理由もありません。繰り返しになりますが、Expert Advisorは独自の処理フローを持っていることが最も重要な違いであると思います。指標はサービスフローで計算され、このフローは他の多くの機能を実行します。そのため、Expert Advisorと共通する機能でも、実装方法が異なります。歴史へのアクセスについては、普遍的な解決策はありません。例えば、Expert Advisorが1つの日付だけを取得したいのか、利用可能な履歴全体を要求したいのか、といったユーザーの要望を端末が事前に予測することはできません。端末は、時間枠への迅速なアクセスを優先する選択をしました。つまり、ユーザーの要求に応じて、履歴の現在の(サーバーと同期した)状態を丸ごとキャッシュしようとします。はい、この方法が不便なアプリケーションのクラスがあります。しかし、プログラマーが「個人的に」端末を書き換えるという要求にこだわらなければ、既存の機能の中に解決策を見出すことができるだろう。もし、まったく解決策がないのであれば、そのときだけ機能拡張の問題が出てきます。一般論は抜きにして、具体的な問題を具体的なコードで記述してください。そうでないと、1つの機能が肥大化して「何もかもがおかしい」「何もかもが不便」という、わけのわからない機能になってしまいます。こんにちは、Anton!あなたの答えを「分解」してみましょう。1."複数の文字データを扱うのにエキスパートを使えば、すべてが便利で簡単になる"チャート表示で3つのシンボルの履歴(終値)が必要です。EAからクローズ履歴を取得する他の方法はありますか?そして、EAから結果を引き出すために「菜園」を作らなければならない!(別ウィンドウで。)2."歴史へのアクセス "に関しては、普遍的な解決策はない。エキスパートアドバイザーが1つの日付だけを取得したいのか、利用可能なすべての履歴を要求したいのか、といったユーザーの要望を端末が事前に予測 することはできません」。消費者の希望を予測する必要はないのです。データがどのような状態であるかをシンボルAND ALLで「伝える」だけです!!!!そうすれば、ユーザーは次にどのような行動をとればいいのか、正確に把握することができます。3.でも、プログラマーが「個人的に」端末を書き換えるという要件にこだわらなければ、既存の機能の中に解決 策を見出すことができるはずです。ましてや「自分で」何かをやれとは言っていませんし、解決策はもちろん既存の機能の中に必ずあるはずです。4."全く解決策がない場合、その時に機能拡張の 問題が出てくる。"機能を拡張する必要はなく、使いやすさや速さを追求したマイナーチェンジを導入すればいいのです。5."一般化せず、具体的な問題を具体的なコードで記述 する。そうでないと、一つの機能で勘違いした機能が肥大化し、「全てが間違っている」「全てが不便 だ」となってしまうのです "よし、具体的なコードで問題点を「拡大解釈」して説明する覚悟を決めよう。ただ、残念ながら参考書は「あてにならない」んですよね...。ご返信ありがとうございます。 Vladimir Karputov 2015.03.30 15:48 #114 Mikalas: 相変わらず、自分は宇宙の中心で、世界は自分を中心に回っているというのがユーザーの立場です。使える機能は使わないといけない。特に、データの取得方法は何度も示されています。 Mikhail Filimonov 2015.03.30 15:50 #115 barabashkakvn: 相変わらず、自分は宇宙の中心で、世界は自分を中心に回っているというのがユーザーの立場です。使える機能は使わないといけない。特に、データの取得方法は何度も示されています。 2x2はいくらですか? Prival-2 2015.03.30 16:06 #116 barabashkakvn: いつものことですが、ユーザーの立場は「私が宇宙の中心で、世界は私を中心に回っている」というものです。持っている機能を使わなければならない。しかも、そのデータの取り方は、一度ならず示されている。そして、その逆だと思うんですね。宇宙の中心は開発者であり、世界は開発者を中心に回っている?そうなんですか?そして、この端末は誰のために設計されているのか、一つの質問に答えてください。自分たちのために作っているのか、ユーザーのために作っているのか。自分たちのためにやってくれるなら、文句はない.いいんです。そして、ユーザーのためなら、その意見も最低限聞くべき...。 Mikhail Filimonov 2015.03.31 03:43 #117 antt : .......。一般化せずに、特定のコードで特定の問題を説明します。そうでなければ、単一の機能の誤解された機能が「すべてが間違っている」と「すべてが不便である」ということに吹き飛ばされることがわかります。記述:リアルアカウントFORTSブローカー。問題-時系列データを取得していません。 1.写真は、ターミナルにデータがあることを示しています。 2.コードは次のとおりです。 //+------------------------------------------------------------------+ //| Ind_test.mq5 | //| Copyright 2015, Mikalas | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Mikalas" #property link "http://www.mql5.com" #property version "1.00" // #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 //--- plot Label1 #property indicator_label1 "Data" #property indicator_type1 DRAW_LINE #property indicator_color1 clrYellow #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- ENUM_TIMEFRAMES time_frame; //Таймфрейм // string sec_symbol; // input string StartData = "2015.03.16" ; //Дата начала расчёта индикатора //--- indicator buffers double MainBuffer[]; //--- datetime start_time; datetime end_time; datetime sec_times[]; // int sec_bars; // int next_month; //+------------------------------------------------------------------+ //| Indicator Expert set second symbol function | //+------------------------------------------------------------------+ string SetSecSymbol( const string aSymbol ) { int str_tire = 0 ; int str_tochka = 0 ; ushort let_symbol; string str_month, str_year; long aYear; int str_size = StringLen ( aSymbol ); for ( int i = 0 ; i < str_size; i++ ) { let_symbol = StringGetCharacter ( aSymbol, i ); if ( let_symbol == '-' ) { str_tire = i; } if ( let_symbol == '.' ) { str_tochka = i; } } if ( ( str_tire != 0 ) && ( str_tochka != 0 ) ) { str_month = StringSubstr ( aSymbol, str_tire + 1 , str_tochka - str_tire - 1 ); str_year = StringSubstr ( aSymbol, str_tochka + 1 , str_size - str_tochka - 1 ); if ( str_month == "12" ) { str_month = IntegerToString ( next_month ); aYear = StringToInteger ( str_year ); aYear = aYear + 1 ; str_year = IntegerToString ( aYear ); } else { long aMonth = StringToInteger ( str_month ); aMonth = aMonth + next_month; if ( aMonth > 12 ) { aMonth = aMonth - 12 ; aYear = StringToInteger ( str_year ); aYear = aYear + 1 ; str_year = IntegerToString ( aYear ); } str_month = IntegerToString ( aMonth ); } } //--- Set new symbol return ( StringSubstr ( aSymbol, 0 , str_tire + 1 ) + str_month + "." + str_year ); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ bool CheckBrent( const string a_symbol ) { ushort let_symbol; int str_size = StringLen ( a_symbol ); for ( int i = 0 ; i < str_size; i++ ) { let_symbol = StringGetCharacter ( a_symbol, i ); if ( let_symbol == '-' ) { string str_info = StringSubstr ( a_symbol, 0 , i ); //--- if ( str_info == "BR" ) { return ( true ); } } } return ( false ); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit () { time_frame = PERIOD_CURRENT ; next_month = 3 ; //--- if ( CheckBrent( _Symbol ) ) next_month = 1 ; //--- sec_symbol = SetSecSymbol( _Symbol ); //--- SymbolSelect ( sec_symbol, true ); //--- end_time = datetime ( SymbolInfoInteger ( _Symbol , SYMBOL_EXPIRATION_TIME ) ); start_time = datetime ( StringToTime ( StartData ) + 19 * 3600 + 10 * 60 ); //--- IndicatorSetInteger ( INDICATOR_DIGITS , 0 ); IndicatorSetString ( INDICATOR_SHORTNAME , "FORTS" ); SetIndexBuffer ( 0 , MainBuffer, INDICATOR_DATA ); PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , EMPTY_VALUE ); ArraySetAsSeries ( MainBuffer, true ); //--- if ( ( TimeCurrent () - start_time ) < 60 ) { Print ( "Слишком мал промежуток времени!" ); return ( INIT_FAILED ); } //--- Print ( "OnInit: Получение баров для символа " , sec_symbol, "..." ); sec_bars = GetBars( sec_symbol, time_frame, start_time, end_time ); //--- return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit ( const int reason ) { if ( reason == REASON_INITFAILED ) { ChartIndicatorDelete ( 0 , 1 , "FORTS" ); } } //+------------------------------------------------------------------+ // Custom indicator Check timer function | //+------------------------------------------------------------------+ bool CheckTimer( const uint start_value, const uint per_value ) { uint end_value = GetTickCount (); if ( end_value < start_value ) { if ( ( start_value - end_value ) >= per_value ) return ( true ); } else { if ( ( end_value - start_value ) >= per_value ) return ( true ); } return ( false ); } //+------------------------------------------------------------------+ //| Custom indicator Get local data function | //+------------------------------------------------------------------+ int GetLocalData( const string a_symbol, ENUM_TIMEFRAMES a_period, datetime start_date, datetime end_date ) { datetime times[ 1 ]; //--- long first_date = SeriesInfoInteger ( a_symbol, PERIOD_M1 , SERIES_TERMINAL_FIRSTDATE ); if ( first_date > 0 ) Print ( "GetLocalData: Первая дата в терминале есть." ); { //--- force timeseries build CopyTime ( a_symbol, a_period, datetime ( first_date ) + PeriodSeconds ( a_period ), 1 , times ); //--- check date first_date = SeriesInfoInteger ( a_symbol, PERIOD_M1 , SERIES_FIRSTDATE ); //--- if ( first_date > 0 && first_date <= long ( start_date ) ) { bool is_sync = bool ( SeriesInfoInteger ( a_symbol, a_period, SERIES_SYNCHRONIZED ) ); //--- if ( is_sync ) { Print ( "GetLocalData: Серия синхронизирована." ); return ( Bars ( a_symbol, a_period, start_date, end_date ) ); } } } Print ( "GetLocalData: Не удалось построить таймсерию!" ); return ( 0 ); } //+------------------------------------------------------------------+ //| Custom indicator Get server data function | //+------------------------------------------------------------------+ int LoadServerData( const string a_symbol, ENUM_TIMEFRAMES period, const datetime start_date, const datetime end_date ) { SeriesInfoInteger ( a_symbol, PERIOD_M1 , SERIES_SERVER_FIRSTDATE ); int fail_cnt = 0 ; //--- while ( fail_cnt < 10 ) { uint start_tick = GetTickCount (); //--- while ( !CheckTimer( start_tick, 5 ) ) { if ( SymbolIsSynchronized ( a_symbol ) ) { Print ( "LoadServerData: Символ синхронизирован." ); return ( GetLocalData( a_symbol, period, start_date, end_date ) ); } } fail_cnt++; start_tick = GetTickCount (); } Print ( "LoadServerData: Не удалось загрузить историю с сервера!" ); return ( 0 ); } //+------------------------------------------------------------------+ //| Custom indicator Get bars function | //+------------------------------------------------------------------+ int GetBars( string symbol, ENUM_TIMEFRAMES period, const datetime start_date, const datetime end_date ) { //---Check for symbol present if ( ! SymbolInfoInteger ( symbol, SYMBOL_SELECT ) ) { ResetLastError (); //--- if ( GetLastError () != ERR_MARKET_UNKNOWN_SYMBOL ) { SymbolSelect ( symbol, true ); } else { Print ( "GetBars: Неизвестный символ - " , symbol ); return ( 0 ); } } //---Check program if ( MQL5InfoInteger ( MQL5_PROGRAM_TYPE ) == PROGRAM_INDICATOR && Period () == period && Symbol () == symbol ) { Print ( "GetBars: Не пройдена проверка типа программы!" ); return ( 0 ); } //--- if ( SymbolIsSynchronized ( symbol ) ) { Print ( "GetBars: Символ синхронизирован." ); //---Check series syncronization bool is_sync = bool ( SeriesInfoInteger ( symbol, period, SERIES_SYNCHRONIZED ) ); if ( is_sync ) { Print ( "GetBars: Серия синхронизирована." ); return ( Bars ( symbol, period, start_date, end_date ) ); } else { Print ( "GetBars: Локальная загрузка..." ); return ( GetLocalData( symbol, period, start_date, end_date ) ); } } else { Print ( "GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера..." ); return ( LoadServerData( symbol, period, start_date, end_date ) ); } //--- return ( 0 ); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate ( const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int nStartBar = rates_total - prev_calculated; //--- ArraySetAsSeries ( time, true ); ArraySetAsSeries ( close, true ); ArraySetAsSeries ( sec_times, true ); //--- Print ( "OnCalculate: Получение баров для символа " , sec_symbol, "..." ); sec_bars = GetBars( sec_symbol, time_frame, start_time, end_time ); //--- if ( sec_bars < 1 ) { Print ( "OnCalculate: Не получены бары по символу - " , sec_symbol ); return ( prev_calculated ); } else { sec_bars = CopyTime ( sec_symbol, time_frame, 0 , sec_bars, sec_times ); if ( sec_bars < 1 ) { Print ( "OnCalculate: Не скопированы тийминги по символу - " , sec_symbol ); return ( prev_calculated ); } } Print ( "OnCalculate: Данные получены." ); return ( rates_total ); } //+------------------------------------------------------------------+ 3.そしてここに結果があります: 2015.03 . 31 06 : 39 : 16.826 Ind_test (BR- 4.15 ,M1) OnInit : Получение баров для символа BR- 5.15 ... 2015.03 . 31 06 : 39 : 16.827 Ind_test (BR- 4.15 ,M1) GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера... 2015.03 . 31 06 : 39 : 16.848 Ind_test (BR- 4.15 ,M1) LoadServerData: Символ синхронизирован. 2015.03 . 31 06 : 39 : 16.848 Ind_test (BR- 4.15 ,M1) GetLocalData: Первая дата в терминале есть. 2015.03 . 31 06 : 39 : 16.848 Ind_test (BR- 4.15 ,M1) GetLocalData: Не удалось построить таймсерию! 2015.03 . 31 06 : 39 : 16.848 Ind_test (BR- 4.15 ,M1) OnCalculate : Получение баров для символа BR- 5.15 ... 2015.03 . 31 06 : 39 : 16.848 Ind_test (BR- 4.15 ,M1) GetBars: Символ синхронизирован. 2015.03 . 31 06 : 39 : 16.848 Ind_test (BR- 4.15 ,M1) GetBars: Серия синхронизирована. 2015.03 . 31 06 : 39 : 16.848 Ind_test (BR- 4.15 ,M1) OnCalculate : Не получены бары по символу - BR- 5.15 2015.03 . 31 06 : 39 : 49.379 Ind_test (ED- 6.15 ,M1) OnInit : Получение баров для символа ED- 9.15 ... 2015.03 . 31 06 : 39 : 49.379 Ind_test (ED- 6.15 ,M1) GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера... 2015.03 . 31 06 : 39 : 49.399 Ind_test (ED- 6.15 ,M1) LoadServerData: Символ синхронизирован. 2015.03 . 31 06 : 39 : 49.399 Ind_test (ED- 6.15 ,M1) GetLocalData: Первая дата в терминале есть. 2015.03 . 31 06 : 39 : 49.399 Ind_test (ED- 6.15 ,M1) GetLocalData: Не удалось построить таймсерию! 2015.03 . 31 06 : 39 : 49.399 Ind_test (ED- 6.15 ,M1) OnCalculate : Получение баров для символа ED- 9.15 ... 2015.03 . 31 06 : 39 : 49.399 Ind_test (ED- 6.15 ,M1) GetBars: Символ синхронизирован. 2015.03 . 31 06 : 39 : 49.399 Ind_test (ED- 6.15 ,M1) GetBars: Серия синхронизирована. 2015.03 . 31 06 : 39 : 49.399 Ind_test (ED- 6.15 ,M1) OnCalculate : Не получены бары по символу - ED- 9.15 2015.03 . 31 06 : 39 : 55.555 Ind_test (Eu- 6.15 ,M1) OnInit : Получение баров для символа Eu- 9.15 ... 2015.03 . 31 06 : 39 : 55.555 Ind_test (Eu- 6.15 ,M1) GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера... 2015.03 . 31 06 : 39 : 55.567 Ind_test (Eu- 6.15 ,M1) LoadServerData: Символ синхронизирован. 2015.03 . 31 06 : 39 : 55.567 Ind_test (Eu- 6.15 ,M1) GetLocalData: Первая дата в терминале есть. 2015.03 . 31 06 : 39 : 55.567 Ind_test (Eu- 6.15 ,M1) GetLocalData: Не удалось построить таймсерию! 2015.03 . 31 06 : 39 : 55.567 Ind_test (Eu- 6.15 ,M1) OnCalculate : Получение баров для символа Eu- 9.15 ... 2015.03 . 31 06 : 39 : 55.567 Ind_test (Eu- 6.15 ,M1) GetBars: Символ синхронизирован. 2015.03 . 31 06 : 39 : 55.567 Ind_test (Eu- 6.15 ,M1) GetBars: Серия синхронизирована. 2015.03 . 31 06 : 39 : 55.567 Ind_test (Eu- 6.15 ,M1) OnCalculate : Не получены бары по символу - Eu- 9.15 2015.03 . 31 06 : 40 : 01.683 Ind_test (GAZR- 6.15 ,M1) OnInit : Получение баров для символа GAZR- 9.15 ... 2015.03 . 31 06 : 40 : 01.683 Ind_test (GAZR- 6.15 ,M1) GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера... 2015.03 . 31 06 : 40 : 01.694 Ind_test (GAZR- 6.15 ,M1) LoadServerData: Символ синхронизирован. 2015.03 . 31 06 : 40 : 01.694 Ind_test (GAZR- 6.15 ,M1) GetLocalData: Первая дата в терминале есть. 2015.03 . 31 06 : 40 : 01.694 Ind_test (GAZR- 6.15 ,M1) GetLocalData: Не удалось построить таймсерию! 2015.03 . 31 06 : 40 : 01.694 Ind_test (GAZR- 6.15 ,M1) OnCalculate : Получение баров для символа GAZR- 9.15 ... 2015.03 . 31 06 : 40 : 01.694 Ind_test (GAZR- 6.15 ,M1) GetBars: Символ синхронизирован. 2015.03 . 31 06 : 40 : 01.694 Ind_test (GAZR- 6.15 ,M1) GetBars: Серия синхронизирована. 2015.03 . 31 06 : 40 : 01.694 Ind_test (GAZR- 6.15 ,M1) OnCalculate : Не получены бары по символу - GAZR- 9.15 ファイル: 20150331.log 7 kb Alexey Da 2015.03.31 08:11 #118 再生方法は?端末を接続して開くと、起動前にすべてのシンボルの履歴がディスクから削除される。 スタート時点からのインジケーターログ2015.03.31 11:00:35.611 tmp6 (GAZR-6.15,M1) OnInit: Получение баров для символа GAZR-9.15... 2015.03.31 11:00:35.611 tmp6 (GAZR-6.15,M1) GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера... 2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1) LoadServerData: Символ синхронизирован. 2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1) GetLocalData: Не удалось построить таймсерию! 2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1) OnCalculate: Получение баров для символа GAZR-9.15... 2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1) GetBars: Символ синхронизирован. 2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1) GetBars: Серия синхронизирована. 2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1) OnCalculate: Не получены бары по символу - GAZR-9.15 2015.03.31 11:00:36.306 tmp6 (GAZR-6.15,M1) OnCalculate: Получение баров для символа GAZR-9.15... 2015.03.31 11:00:36.306 tmp6 (GAZR-6.15,M1) GetBars: Символ синхронизирован. 2015.03.31 11:00:36.306 tmp6 (GAZR-6.15,M1) GetBars: Серия синхронизирована. 2015.03.31 11:00:36.306 tmp6 (GAZR-6.15,M1) OnCalculate: Данные получены. 2015.03.31 11:00:37.123 tmp6 (GAZR-6.15,M1) OnCalculate: Получение баров для символа GAZR-9.15... 2015.03.31 11:00:37.123 tmp6 (GAZR-6.15,M1) GetBars: Символ синхронизирован. 2015.03.31 11:00:37.123 tmp6 (GAZR-6.15,M1) GetBars: Серия синхронизирована. 2015.03.31 11:00:37.123 tmp6 (GAZR-6.15,M1) OnCalculate: Данные получены. このように、起動から1秒足らずでシンボルデータがインジケーターに反映されるようになりました。 Mikhail Filimonov 2015.03.31 12:56 #119 alexvd:再生方法は?端末を接続して開くと、起動前にすべてのシンボルの履歴がディスクから削除される。 スタート時点からのインジケーターログこのように、起動から1秒以内にシンボルのデータがインジケーターに反映されるようになりました。アフタヌーン!つまり、電子取引にはSECONDSは時間ではないのですか?つまり、同期したシンボルと 同期した時系列では、得られないバー(すぐ)-これは正常なのでしょうか?(私にとっては)間違いです。2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1) GetBars: Символ синхронизирован. 2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1) GetBars: Серия синхронизирована. 2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1) OnCalculate: Не получены бары по символу - GAZR-9.152.TERMINALにデータがある 場合(図3.16以降の全バー参照)、強制的にサーバーに移動させられてしまいますが、これは正常なのでしょうか?情報を得るまでの不便さ、時間の長さは(私にとって) 当然である。2015.03.31 11:00:35.611 tmp6 (GAZR-6.15,M1) OnInit: Получение баров для символа GAZR-9.15... 2015.03.31 11:00:35.611 tmp6 (GAZR-6.15,M1) GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера... Anton 2015.03.31 13:56 #120 Mikalas:こんにちは。電子商取引における1秒は、時間ではないのですか? スタートから1秒、すなわちスタート時に1回。"時間じゃない" 1...5678910111213141516171819...31 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
吐け、エドワード、吐け =)
それはわかるのですが、なぜ上に書いたようなやり方ではダメだったのでしょうか?
情報の処理速度に影響を与えることはなかったはずです。
ツールに関する情報があれば、それが初めて登場した日付を記録し、メモリに格納する - 8バイト!
保存しないこともできますが、SymbolSelect()をすると、メモリに入れることになります。
SeriesInfoInteger (SERIES_TERMINAL_FIRSTDATE) 関数でアドレス指定すると、次のようになります。
A -1 - データなし
Б.0 - データなし、ただし準備中
В.A - 最初の情報の日付
そうすれば、すべてがクリアで透明なものになるはずです。
-1 - サーバーへ行く
0 - 次の反復を待って、時系列をチェックおよび/または構築します。
> 0 ビルド時系列
あなたの言及から、私はあなたがそれをほとんどやったと理解しましたが、そうでないことが判明しました。
あるプログラマーが書き始め、別の人が書き終えたらしい
あなたの実装はFOREXには向いていますが、FORTSには非常に不都合です。
FORTSの場合、相場が長期間来ないこともあり、プラットフォームから時系列をダウンロードする。
というメッセージが表示され、再度、サーバーにログインしてデータを取得するプロセスを繰り返さなければ なりません。
Expert Advisorを使えば、複数のシンボルデータを扱うことができ、すべてが便利で簡単になります。MT5環境のインジケーターは、主にその時系列データを素早く計算し、その計算結果をチャート上に表示するものです。プラットフォームの進化に伴い、専門家が利用できる多くの機能を獲得しましたが、基本的なアーキテクチャーの制約は残りました。また、インジケータとEAの違いを完全に排除する理由もありません。繰り返しになりますが、Expert Advisorは独自の処理フローを持っていることが最も重要な違いであると思います。指標はサービスフローで計算され、このフローは他の多くの機能を実行します。そのため、Expert Advisorと共通する機能であっても、実装が異なっています。
歴史へのアクセスについては、普遍的な解決策はありません。例えば、Expert Advisorが1つの日付だけを取得したいのか、利用可能な履歴全体を要求したいのか、といったユーザーの要望を端末が事前に予測することはできません。端末は、時間枠の高速アクセスを選択し、すなわち、ユーザの要求に応じて、現在の(サーバと同期した)履歴の状態を完全にキャッシュしようとする。はい、この方法が不便なアプリケーションのクラスがあります。しかし、プログラマーが「個人的に」端末を書き換えるという要求にこだわらなければ、既存の機能の中に解決策を見出すことができるだろう。もし、まったく解決策がないのであれば、そのときだけ機能拡張の問題が出てきます。
一般論は抜きにして、具体的な問題を具体的なコードで記述してください。そうでないと、1つの機能が肥大化して「何もかもがおかしい」「何もかもが不便」という、わけのわからない機能になってしまいます。
Expert Advisor を使って複数のシンボルデータを扱うと、すべてが便利でシンプルになります。MT5環境におけるインジケータは、主にその時系列データに対して高速に計算を行い、その結果をチャート上に表示することを目的として設計されています。プラットフォームの進化に伴い、専門家が利用できる多くの機能を獲得しましたが、基本的なアーキテクチャーの制約は残りました。また、インジケータとEAの違いを完全に排除する理由もありません。繰り返しになりますが、Expert Advisorは独自の処理フローを持っていることが最も重要な違いであると思います。指標はサービスフローで計算され、このフローは他の多くの機能を実行します。そのため、Expert Advisorと共通する機能でも、実装方法が異なります。
歴史へのアクセスについては、普遍的な解決策はありません。例えば、Expert Advisorが1つの日付だけを取得したいのか、利用可能な履歴全体を要求したいのか、といったユーザーの要望を端末が事前に予測することはできません。端末は、時間枠への迅速なアクセスを優先する選択をしました。つまり、ユーザーの要求に応じて、履歴の現在の(サーバーと同期した)状態を丸ごとキャッシュしようとします。はい、この方法が不便なアプリケーションのクラスがあります。しかし、プログラマーが「個人的に」端末を書き換えるという要求にこだわらなければ、既存の機能の中に解決策を見出すことができるだろう。もし、まったく解決策がないのであれば、そのときだけ機能拡張の問題が出てきます。
一般論は抜きにして、具体的な問題を具体的なコードで記述してください。そうでないと、1つの機能が肥大化して「何もかもがおかしい」「何もかもが不便」という、わけのわからない機能になってしまいます。
こんにちは、Anton!
あなたの答えを「分解」してみましょう。
1."複数の文字データを扱うのにエキスパートを使えば、すべてが便利で簡単になる"
チャート表示で3つのシンボルの履歴(終値)が必要です。
EAからクローズ履歴を取得する他の方法はありますか?
そして、EAから結果を引き出すために「菜園」を作らなければならない!(別ウィンドウで。)
2."歴史へのアクセス "に関しては、普遍的な解決策はない。エキスパートアドバイザーが1つの日付だけを取得したいのか、利用可能なすべての履歴を要求したいのか、といったユーザーの要望を端末が事前に予測 することはできません」。
消費者の希望を予測する必要はないのです。データがどのような状態であるかをシンボルAND ALLで「伝える」だけです!!!!
そうすれば、ユーザーは次にどのような行動をとればいいのか、正確に把握することができます。
3.でも、プログラマーが「個人的に」端末を書き換えるという要件にこだわらなければ、既存の機能の中に解決 策を見出すことができるはずです。
ましてや「自分で」何かをやれとは言っていませんし、解決策はもちろん既存の機能の中に必ずあるはずです。
4."全く解決策がない場合、その時に機能拡張の 問題が出てくる。"
機能を拡張する必要はなく、使いやすさや速さを追求したマイナーチェンジを導入すればいいのです。
5."一般化せず、具体的な問題を具体的なコードで記述 する。そうでないと、一つの機能で勘違いした機能が肥大化し、「全てが間違っている」「全てが不便 だ」となってしまうのです "
よし、具体的なコードで問題点を「拡大解釈」して説明する覚悟を決めよう。
ただ、残念ながら参考書は「あてにならない」んですよね...。
ご返信ありがとうございます。
相変わらず、自分は宇宙の中心で、世界は自分を中心に回っているというのがユーザーの立場です。使える機能は使わないといけない。特に、データの取得方法は何度も示されています。
いつものことですが、ユーザーの立場は「私が宇宙の中心で、世界は私を中心に回っている」というものです。持っている機能を使わなければならない。しかも、そのデータの取り方は、一度ならず示されている。
そして、その逆だと思うんですね。宇宙の中心は開発者であり、世界は開発者を中心に回っている?そうなんですか?
そして、この端末は誰のために設計されているのか、一つの質問に答えてください。自分たちのために作っているのか、ユーザーのために作っているのか。
自分たちのためにやってくれるなら、文句はない.いいんです。
そして、ユーザーのためなら、その意見も最低限聞くべき...。
.......。
一般化せずに、特定のコードで特定の問題を説明します。そうでなければ、単一の機能の誤解された機能が「すべてが間違っている」と「すべてが不便である」ということに吹き飛ばされることがわかります。
記述:
リアルアカウントFORTSブローカー。
問題-時系列データを取得していません。
1.写真は、ターミナルにデータがあることを示しています。
2.コードは次のとおりです。
3.そしてここに結果があります:
再生方法は?
端末を接続して開くと、起動前にすべてのシンボルの履歴がディスクから削除される。
スタート時点からのインジケーターログ
このように、起動から1秒足らずでシンボルデータがインジケーターに反映されるようになりました。
再生方法は?
端末を接続して開くと、起動前にすべてのシンボルの履歴がディスクから削除される。
スタート時点からのインジケーターログ
このように、起動から1秒以内にシンボルのデータがインジケーターに反映されるようになりました。
アフタヌーン!
つまり、電子取引にはSECONDSは時間ではないのですか?
つまり、同期したシンボルと 同期した時系列では、得られない
バー(すぐ)-これは正常なのでしょうか?
(私にとっては)間違いです。
2.TERMINALにデータがある 場合(図3.16以降の全バー参照)、強制的にサーバーに移動させられてしまいますが、これは正常なのでしょうか?
情報を得るまでの不便さ、時間の長さは(私にとって) 当然である。
こんにちは。
電子商取引における1秒は、時間ではないのですか?