要塞:初心者を助けるために - ページ 2 123456789...14 新しいコメント Dmitry Fedoseev 2015.11.25 04:43 #11 Михаил:では、「ベストププアコーダー2015」の称号の第一候補はあなたです。P/S 笑って椅子から落ちないようにお願いします :)4行の コードを理解できなかったら怒れ、怒れ(理解しやすくするために2行ではなく、わざと4行にした)。何が問題なのか?86400番が何番なのかは不明ですが?それとも3600?86400は1日の秒数です。3600 - 1時間で。ps.どんな笑い方なんだろう?ここで泣くしかない。 Mikhail Filimonov 2015.11.28 01:12 #12 よく使う機能、便利な機能SetStDayTime()関数はあまり高速に動作しなかったのでデザインを変えたものを掲載します(セルゲイさんありがとうございます)。datetime SetStDayTime() { MqlDateTime dt_str; ulong one_day = 86400; TimeTradeServer( dt_str ); int hour = dt_str.hour; dt_str.hour = 19; dt_str.min = 0; dt_str.sec = 0; ulong time_start = ulong( StructToTime( dt_str ) ); //--- switch( dt_str.day_of_week ) { case 6: time_start -= one_day; break; case 0: time_start -= one_day * 2; break; case 1: if ( hour < 19 ) time_start -= one_day * 3; break; default: if ( hour < 19 ) time_start -= one_day; break; } return( datetime( time_start ) ); } Mikhail Filimonov 2015.11.28 01:20 #13 特徴OrderSend()のリターンコードとオーダーチケットに受信確認(TRADE_RETCODE_PLACED)が発生する。if ( OrderSend( request, result ) ) { if ( result.retcode == TRADE_RETCODE_PLACED ) { ticket = result.order; } }であり、OnTradeTransaction()のOrderSendAsync()関数については、全く意味しない。注文は本当に交換に出される。そのため、注文状況の追加チェックが必要である(注文に関する他の操作と同様)。enum ENUM_ORD_REAL_STATE { ORD_NOT_SPECIFIED = 0, //Состояние ордера не определено ORD_NONE_CANCELED = 1, //Ордера нет, отменён пользователем ORD_NONE_PARTIAL_CANCELED = 2, //Ордера нет, исполнился частично (не был залит вторым объёмом) ORD_NONE_PARTIAL = 3, //Ордера нет, исполнился частично ORD_NONE_EXPIRED = 4, //Ордера нет, удалён по сроку ORD_NONE_FILLED = 5, //Ордера нет, исполнился полностью ORD_NONE_REJECTED = 6, //Ордера нет, отклонён брокером(биржей) ORD_BUSY = 7, //Ордер находится в переходном состоянии ORD_EXIST = 8, //Ордер выставлен на биржу, возможны действия над ним ORD_EXIST_PARTIAL = 9 //Ордер выставлен на биржу, частично исполнился, возможны действия над ним }; // ENUM_ORD_REAL_STATE CheckOrderState( const ulong ticket ) { if ( ticket > 0 ) { if ( HistoryOrderSelect( ticket ) ) //Только не существующий ордер может находится в истории { ENUM_ORDER_STATE ord_state = ENUM_ORDER_STATE( HistoryOrderGetInteger( ticket, ORDER_STATE ) ); double init_volume = HistoryOrderGetDouble( ticket, ORDER_VOLUME_INITIAL ); double cur_volume = HistoryOrderGetDouble( ticket, ORDER_VOLUME_CURRENT ); //--- switch( ord_state ) { case ORDER_STATE_CANCELED: if ( init_volume == init_volume ) { return( ORD_NONE_CANCELED ); } else { return( ORD_NONE_PARTIAL_CANCELED ); } break; case ORDER_STATE_PARTIAL: return( ORD_NONE_PARTIAL ); break; case ORDER_STATE_EXPIRED: return( ORD_NONE_EXPIRED ); break; case ORDER_STATE_FILLED: return( ORD_NONE_FILLED ); break; case ORDER_STATE_REJECTED: return( ORD_NONE_REJECTED ); break; } } else if ( OrderSelect( ticket ) ) { ENUM_ORDER_STATE ord_state = ENUM_ORDER_STATE( OrderGetInteger( ORDER_STATE ) ); //--- switch( ord_state ) { case ORDER_STATE_STARTED: case ORDER_STATE_REQUEST_ADD: case ORDER_STATE_REQUEST_MODIFY: case ORDER_STATE_REQUEST_CANCEL: return( ORD_BUSY ); break; case ORDER_STATE_PARTIAL: return( ORD_EXIST_PARTIAL ); break; case ORDER_STATE_PLACED: return( ORD_EXIST ); break; } } } return( ORD_NOT_SPECIFIED ); } Mikhail Filimonov 2015.12.01 19:21 #14 CheckOrderState() に誤記があります。init_volume == init_volumeの 代わりにinit_volume == cur_volume であるべきです。 Mikhail Filimonov 2015.12.03 16:43 #15 よく使う機能、便利な機能CheckOrderState() を OrderRealSelect() に変更し、注文に関するデータを取得/受信しないオプションを追加しました。#define ERR_ZERO_TICKET -1 // enum ENUM_ORD_REAL_STATE { ORD_NOT_SPECIFIED = 0, //Состояние ордера не определено ORD_NONE_CANCELED = 1, //Ордера нет, отменён пользователем ORD_NONE_PARTIAL_CANCELED = 2, //Ордера нет, исполнился частично (не был залит вторым объёмом) ORD_NONE_PARTIAL = 3, //Ордера нет, исполнился частично ORD_NONE_EXPIRED = 4, //Ордера нет, удалён по сроку ORD_NONE_FILLED = 5, //Ордера нет, исполнился полностью ORD_NONE_REJECTED = 6, //Ордера нет, отклонён брокером(биржей) ORD_BUSY = 7, //Ордер находится в переходном состоянии ORD_EXIST = 8, //Ордер выставлен на биржу, возможны действия над ним ORD_EXIST_PARTIAL = 9 //Ордер выставлен на биржу, частично исполнился, возможны действия над ним }; enum ENUM_ORD_SELECT { SELECT_ERROR = 0, SELECT_FALSE = 1, SELECT_TRUE = 2, SELECT_BUSY = 3 }; // struct ORDER_DATA { int error_code; datetime time_setup; ENUM_ORDER_TYPE type; ENUM_ORDER_STATE state; ENUM_ORD_REAL_STATE real_state; datetime expiration; datetime time_done; long t_set_msc; long t_done_msc; ENUM_ORDER_TYPE_FILLING type_filling; ENUM_ORDER_TYPE_TIME type_time; long magic; long pos_id; double vol_init; double vol_cur; double price_open; double sl; double tp; double price_cur; double price_stlim; string symbol; string comment; }; // //+------------------------------------------------------------------+ // Expert Order Real Select function | //+------------------------------------------------------------------+ ENUM_ORD_SELECT OrderRealSelect( const ulong ticket, ORDER_DATA &ord_data, const bool get_data ) { double init_vol = 0; double cur_vol = 0; ZeroMemory( ord_data ); ord_data.real_state = ORD_NOT_SPECIFIED; ord_data.error_code = ERR_SUCCESS; ResetLastError(); //--- if ( ticket > 0 ) { if ( HistoryOrderSelect( ticket ) ) { if ( get_data ) { ord_data.comment = HistoryOrderGetString( ticket, ORDER_COMMENT ); ord_data.expiration = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_EXPIRATION ) ); ord_data.magic = HistoryOrderGetInteger( ticket, ORDER_MAGIC ); ord_data.pos_id = HistoryOrderGetInteger( ticket, ORDER_POSITION_ID ); ord_data.price_cur = HistoryOrderGetDouble( ticket, ORDER_PRICE_CURRENT ); ord_data.price_open = HistoryOrderGetDouble( ticket, ORDER_PRICE_OPEN ); ord_data.price_stlim = HistoryOrderGetDouble( ticket, ORDER_PRICE_STOPLIMIT ); ord_data.sl = HistoryOrderGetDouble( ticket, ORDER_SL ); ord_data.state = ENUM_ORDER_STATE( HistoryOrderGetInteger( ticket, ORDER_STATE ) ); ord_data.symbol = HistoryOrderGetString( ticket, ORDER_SYMBOL ); ord_data.t_done_msc = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_DONE_MSC ) ); ord_data.t_set_msc = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_SETUP_MSC ) ); ord_data.time_done = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_DONE ) ); ord_data.time_setup = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_SETUP ) ); ord_data.tp = HistoryOrderGetDouble( ticket, ORDER_TP ); ord_data.type = ENUM_ORDER_TYPE( HistoryOrderGetInteger( ticket, ORDER_TYPE ) ); ord_data.type_filling = ENUM_ORDER_TYPE_FILLING( HistoryOrderGetInteger( ticket, ORDER_TYPE_FILLING ) ); ord_data.type_time = ENUM_ORDER_TYPE_TIME( HistoryOrderGetInteger( ticket, ORDER_TYPE_TIME ) ); ord_data.vol_cur = HistoryOrderGetDouble( ticket, ORDER_VOLUME_CURRENT ); ord_data.vol_init = HistoryOrderGetDouble( ticket, ORDER_VOLUME_INITIAL ); } else { ord_data.state = ENUM_ORDER_STATE( HistoryOrderGetInteger( ticket, ORDER_STATE ) ); cur_vol = HistoryOrderGetDouble( ticket, ORDER_VOLUME_CURRENT ); init_vol = HistoryOrderGetDouble( ticket, ORDER_VOLUME_INITIAL ); } //--- switch( ord_data.state ) { case ORDER_STATE_CANCELED: if ( get_data ) { if ( ord_data.vol_init == ord_data.vol_cur ) { ord_data.real_state = ORD_NONE_CANCELED; } else { ord_data.real_state = ORD_NONE_PARTIAL_CANCELED; } } else { if ( init_vol == cur_vol ) { ord_data.real_state = ORD_NONE_CANCELED; } else { ord_data.real_state = ORD_NONE_PARTIAL_CANCELED; } } break; case ORDER_STATE_PARTIAL: ord_data.real_state = ORD_NONE_PARTIAL; break; case ORDER_STATE_EXPIRED: ord_data.real_state = ORD_NONE_EXPIRED; break; case ORDER_STATE_FILLED: ord_data.real_state = ORD_NONE_FILLED; break; case ORDER_STATE_REJECTED: ord_data.real_state = ORD_NONE_REJECTED; break; } } else if ( OrderSelect( ticket ) ) { if ( get_data ) { ord_data.comment = OrderGetString( ORDER_COMMENT ); ord_data.expiration = datetime( OrderGetInteger( ORDER_TIME_EXPIRATION ) ); ord_data.magic = OrderGetInteger( ORDER_MAGIC ); ord_data.pos_id = OrderGetInteger( ORDER_POSITION_ID ); ord_data.price_cur = OrderGetDouble( ORDER_PRICE_CURRENT ); ord_data.price_open = OrderGetDouble( ORDER_PRICE_OPEN ); ord_data.price_stlim = OrderGetDouble( ORDER_PRICE_STOPLIMIT ); ord_data.sl = OrderGetDouble( ORDER_SL ); ord_data.state = ENUM_ORDER_STATE( OrderGetInteger( ORDER_STATE ) ); ord_data.symbol = OrderGetString( ORDER_SYMBOL ); ord_data.t_done_msc = datetime( OrderGetInteger( ORDER_TIME_DONE_MSC ) ); ord_data.t_set_msc = datetime( OrderGetInteger( ORDER_TIME_SETUP_MSC ) ); ord_data.time_done = datetime( OrderGetInteger( ORDER_TIME_DONE ) ); ord_data.time_setup = datetime( OrderGetInteger( ORDER_TIME_SETUP ) ); ord_data.tp = OrderGetDouble( ORDER_TP ); ord_data.type = ENUM_ORDER_TYPE( OrderGetInteger( ORDER_TYPE ) ); ord_data.type_filling = ENUM_ORDER_TYPE_FILLING( OrderGetInteger( ORDER_TYPE_FILLING ) ); ord_data.type_time = ENUM_ORDER_TYPE_TIME( OrderGetInteger( ORDER_TYPE_TIME ) ); ord_data.vol_cur = OrderGetDouble( ORDER_VOLUME_CURRENT ); ord_data.vol_init = OrderGetDouble( ORDER_VOLUME_INITIAL ); } else { ord_data.state = ENUM_ORDER_STATE( OrderGetInteger( ORDER_STATE ) ); } //--- switch( ord_data.state ) { case ORDER_STATE_STARTED: case ORDER_STATE_REQUEST_ADD: case ORDER_STATE_REQUEST_MODIFY: case ORDER_STATE_REQUEST_CANCEL: ord_data.real_state = ORD_BUSY; break; case ORDER_STATE_PARTIAL: ord_data.real_state = ORD_EXIST_PARTIAL; break; case ORDER_STATE_PLACED: ord_data.real_state = ORD_EXIST; break; } } else { ord_data.error_code = GetLastError(); } //--- if ( ( ord_data.error_code != ERR_SUCCESS ) || ( ord_data.real_state == ORD_NOT_SPECIFIED ) ) { return( SELECT_ERROR ); } else { switch( ord_data.real_state ) { case ORD_BUSY: return( SELECT_BUSY ); break; case ORD_EXIST: case ORD_EXIST_PARTIAL: return( SELECT_TRUE ); break; default: return( SELECT_FALSE ); break; } } } else { ord_data.error_code = ERR_ZERO_TICKET; return( SELECT_ERROR ); } }注文を変更したり削除したりする場合は、その注文が存在することだけを知っていればよい。ORDER_DATA order_data; ulong a_ticket = 12345; //--- if ( OrderRealSelect( a_ticket, order_data, false ) == SELECT_TRUE ) { //Удаляем или модифицируем ордер ( false - не получаем данные по ордеру) }削除した後に、注文に関するデータを取得する必要がある場合。ORDER_DATA order_data; ulong a_ticket = 12345; //--- if ( OrderRealSelect( a_ticket, order_data, true ) == SELECT_FALSE ) { a_ticket = 0; //Смотрим данные по ордеру в order_data } エラーが発生した場合ORDER_DATA order_data; ulong a_ticket = 12345; //--- if ( OrderRealSelect( a_ticket, order_data, true ) == SELECT_ERROR ) { //Не важно, запрашивали мы данные по ордеру (true) или нет(false) коды ошибки //будут всегда switch( order_data.error_code ) { //................................. } } Mikhail Filimonov 2015.12.04 05:53 #16 よく使う機能、便利な機能非効率なトランザクションをカウントするための機能セットを再設計。 //+------------------------------------------------------------------+ //| Tr_count.mq5 | //| Copyright 2015, Mikalas | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Mikalas" #property link "https://www.mql5.com" #property version "1.00" // input double TrPoint = 1; //Балл за транзакцию input ulong DealPoint = 40; //Балл за сделку input double NotEff = 1970; //Неэффективных транзакций // bool set_error; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { set_error = false; //--- if ( !GlobalVariableCheck( "trans_count" ) ) { datetime a_time = GlobalVariableSet( "trans_count", 0 ); if ( ulong( a_time ) == 0 ) { MessageBox( "Глобальная переменная терминала 'Счётчик транзакций' не создана!", "Ошибка", MB_OK | MB_ICONHAND ); return( INIT_FAILED ); } } //--- if ( !GlobalVariableCheck( "not_eff_cnt" ) ) { datetime a_time = GlobalVariableSet( "not_eff_cnt", 0 ); if ( ulong( a_time ) == 0 ) { MessageBox( "Глобальная переменная терминала 'Счётчик неэффективных транзакций' не создана!", "Ошибка", MB_OK | MB_ICONHAND ); return( INIT_FAILED ); } } else { datetime acs_time = GlobalVariableTime( "not_eff_cnt" ); datetime cur_time = TimeTradeServer(); if ( ( ulong( cur_time ) - ulong( acs_time ) ) > 7200 ) { if ( MessageBox( "Последняя запись в Счётчик неэффективных транзакций\n была произведена " + TimeToString( acs_time ) + ". Нажмите 'OK' для\n обнуления переменных, или 'Cancel' для продолжения.", "Внимание", MB_OKCANCEL | MB_ICONQUESTION ) == IDOK ) { GlobalVariableSet( "trans_count", 0 ); GlobalVariableSet( "not_eff_cnt", 0 ); } } } return( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert Set start day time function | //+------------------------------------------------------------------+ datetime SetStDayTime() { MqlDateTime dt_str; ulong one_day = 86400; TimeTradeServer( dt_str ); int hour = dt_str.hour; dt_str.hour = 19; dt_str.min = 0; dt_str.sec = 0; ulong time_start = ulong( StructToTime( dt_str ) ); //--- switch( dt_str.day_of_week ) { case 6: time_start -= one_day; break; case 0: time_start -= one_day * 2; break; case 1: if ( hour < 19 ) time_start -= one_day * 3; break; default: if ( hour < 19 ) time_start -= one_day; break; } return( datetime( time_start ) ); } //+------------------------------------------------------------------+ //| Expert calc deals fee function | //+------------------------------------------------------------------+ double GetExgangeFee( const datetime start_time ) { double all_fee = 0.0; ulong deal_ticket; //--- if ( HistorySelect( start_time, TimeTradeServer() ) ) { int deals_total = HistoryDealsTotal(); //--- if ( deals_total > 0 ) { for ( uint i = 0; i < uint( deals_total ); i++ ) { deal_ticket = HistoryDealGetTicket( i ); //--- if ( deal_ticket > 0 ) { ulong order_ticket = ulong( HistoryDealGetInteger( deal_ticket, DEAL_ORDER ) ); if ( order_ticket > 0 ) { all_fee += HistoryDealGetDouble( deal_ticket, DEAL_COMMISSION ); } } } return( MathAbs( all_fee ) ); } } return( 0 ); } //+------------------------------------------------------------------+ //| Expert set not effective transactions function | //+------------------------------------------------------------------+ void SetNotEffTrans( const double tr_cnt ) { double a_cnt = tr_cnt + 1; datetime start_time = SetStDayTime(); double tr_bonus = GetExgangeFee( start_time ); if ( NormalizeDouble( ( a_cnt * TrPoint - tr_bonus * DealPoint ), 0 ) > 0 ) { double tr_count; ulong i = 0; do { i++; if ( GlobalVariableGet( "not_eff_cnt", tr_count ) ) { if ( GlobalVariableSetOnCondition( "not_eff_cnt", tr_count + 1, tr_count ) ) { i = 100; } } } while( i < 100 ); } } //+------------------------------------------------------------------+ //| Expert Check limit transactions function | //+------------------------------------------------------------------+ bool CheckLimitTrans() { double a_count; //--- if ( GlobalVariableGet( "not_eff_cnt", a_count ) ) { if ( a_count >= NotEff ) { if ( !set_error ) { set_error = true; //чтобы один раз выводилось Print( "Исчерпан лимит установки всех ордеров за торговый день!" ); } return( false ); } } else { Print( "Не получено значение глобальной переменной 'not_eff_cnt'!" ); return( false ); } return( true ); } //+------------------------------------------------------------------+ //| Expert Set transaction count function | //+------------------------------------------------------------------+ void SetTransCount() { double tr_count; uint i = 0; do { i++; if ( GlobalVariableGet( "trans_count", tr_count ) ) { if ( GlobalVariableSetOnCondition( "trans_count", tr_count + 1, tr_count ) ) { i = 100; } } } while( i < 100 ); //--- SetNotEffTrans( tr_count ); } //+------------------------------------------------------------------+ //| Expert Check trading time function | //+------------------------------------------------------------------+ void CheckResetTime() { MqlDateTime trade_time; TimeTradeServer( trade_time ); //--- if ( trade_time.hour == 18 ) { if ( ( trade_time.min > 45 ) && ( trade_time.min <= 49 ) ) { GlobalVariableSet( "trans_count", 0 ); GlobalVariableSet( "not_eff_cnt", 0 ); set_error = false; } } } // По таймеру можно вызывать CheckResetTime(), чтобы в основной клиринг обнулить переменные // Функция SetTransCount() вызвается после успешной отсылки ордера // Функция CheckLimitTrans() вызвается перед каждой установкой ордера Mikhail Filimonov 2015.12.08 18:33 #17 よく使う機能、便利な機能もし、保留中の注文を 現在の日以外にも有効にしたい場合は、次のようにします。リクエストで指定する必要があります (この例では、有効期限を指定しています)(Thanks Sergey) 最近判明したことですが、この実装は現在の先物と次の 先物で動作します。長尺の先物取引には使えません。int OnInit() { exp_day = GetCutTime( aSymbol ); return( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert Set expiration day function | //+------------------------------------------------------------------+ datetime GetCutTime( const string t_symbol ) { MqlDateTime b_time; datetime a_time = datetime( SymbolInfoInteger( t_symbol, SYMBOL_EXPIRATION_TIME ) ); TimeToStruct( a_time, b_time ); b_time.hour = 0; b_time.min = 0; b_time.sec = 0; return( StructToTime( b_time ) ); } //--- При установке и модификации ордера request.type_time = ORDER_TIME_SPECIFIED_DAY; request.expiration = exp_day; Mikhail Filimonov 2015.12.08 20:08 #18 よく使う機能、便利な機能設定値をファイルに書き込む//+------------------------------------------------------------------+ //| Expert Save settings function | //+------------------------------------------------------------------+ void SaveSettings() { string file_name = _Symbol + ".dat"; int file_handle; bool file_found = true; //--- if ( FileIsExist( file_name, 0 ) ) { if ( FileDelete( file_name, 0 ) ) file_found = false; } else { file_found = false; } //--- if ( !file_found ) { file_handle = FileOpen( file_name, FILE_WRITE|FILE_BIN ); if ( file_handle != INVALID_HANDLE ) { FileWriteLong( file_handle, e_high ); FileWriteLong( file_handle, a_profit ); FileWriteLong( file_handle, e_low ); FileWriteLong( file_handle, ord_delta_high ); FileWriteLong( file_handle, ord_delta_low ); FileWriteLong( file_handle, order_delta ); FileWriteLong( file_handle, exit_delta ); FileClose( file_handle ); } } }ファイルから設定を読み込む//+------------------------------------------------------------------+ //| Expert Load setings function | //+------------------------------------------------------------------+ void LoadSettings() { string file_name = _Symbol + ".dat"; int file_handle; //--- if ( FileIsExist( file_name, 0 ) ) { file_handle = FileOpen( file_name, FILE_READ|FILE_BIN ); if ( file_handle != INVALID_HANDLE ) { e_high = FileReadLong( file_handle ); a_profit = FileReadLong( file_handle ); e_low = FileReadLong( file_handle ); ord_delta_high = FileReadLong( file_handle ); ord_delta_low = FileReadLong( file_handle ); order_delta = FileReadLong( file_handle ); exit_delta = FileReadLong( file_handle ); FileClose( file_handle ); } } } Mikhail Filimonov 2015.12.08 20:12 #19 よく使う機能、便利な機能EAをアカウントにリンクさせる。//+------------------------------------------------------------------+ //| Expert Check Account owner function | //+------------------------------------------------------------------+ bool ExpCheckUser() { long acc_login = long ( AccountInfoInteger( ACCOUNT_LOGIN ) ); string acc_user = AccountInfoString( ACCOUNT_NAME ); if ( ( acc_login == 12345 ) && ( acc_user == "Михайлов Михаил Михайлович" ) ) { return( true ); } return( false ); } Mikhail Filimonov 2015.12.08 20:21 #20 よく使う機能、便利な機能ポイントを楽器の価格に換算する機能。double PointsToPrice( const long a_points ) { double step_price = SymbolInfoDouble( _Symbol, SYMBOL_TRADE_TICK_SIZE ); double a_price = ( double( a_points ) * _Point ) / step_price; if ( a_points < 0 ) { a_price = MathFloor( a_price ) * step_price; } else { a_price = MathCeil( a_price ) * step_price; } return( NormalizeDouble( a_price, _Digits ) ); } 123456789...14 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
では、「ベストププアコーダー2015」の称号の第一候補はあなたです。
P/S 笑って椅子から落ちないようにお願いします :)
4行の コードを理解できなかったら怒れ、怒れ(理解しやすくするために2行ではなく、わざと4行にした)。
何が問題なのか?86400番が何番なのかは不明ですが?それとも3600?
86400は1日の秒数です。3600 - 1時間で。
ps.どんな笑い方なんだろう?ここで泣くしかない。
よく使う機能、便利な機能
SetStDayTime()関数はあまり高速に動作しなかったので
デザインを変えたものを掲載します(セルゲイさんありがとうございます)。
特徴
OrderSend()のリターンコードとオーダーチケットに受信確認(TRADE_RETCODE_PLACED)が発生する。
であり、OnTradeTransaction()のOrderSendAsync()関数については、全く意味しない。
注文は本当に交換に出される。
そのため、注文状況の追加チェックが必要である(注文に関する他の操作と同様)。
CheckOrderState() に誤記があります。
init_volume == init_volumeの 代わりに
init_volume == cur_volume であるべきです。
よく使う機能、便利な機能
CheckOrderState() を OrderRealSelect() に変更し、注文に関するデータを取得/受信しないオプションを追加しました。
注文を変更したり削除したりする場合は、その注文が存在することだけを知っていればよい。
削除した後に、注文に関するデータを取得する必要がある場合。
エラーが発生した場合
よく使う機能、便利な機能
非効率なトランザクションをカウントするための機能セットを再設計。
よく使う機能、便利な機能
もし、保留中の注文を 現在の日以外にも有効にしたい場合は、次のようにします。
リクエストで指定する必要があります (この例では、有効期限を指定しています)
(Thanks Sergey) 最近判明したことですが、この実装は現在の先物と次の 先物で動作します。
長尺の先物取引には使えません。
よく使う機能、便利な機能
設定値をファイルに書き込む
ファイルから設定を読み込む
よく使う機能、便利な機能
EAをアカウントにリンクさせる。
よく使う機能、便利な機能
ポイントを楽器の価格に換算する機能。