if (!res1) return false; //сейчас торговать запрещено if (res1 && res2) return true; //и сейчас и через час торговать можно return false; //если зависло разрешение от TimeCurrent, то через час (или с запасом в несколько минут) покажет фалсе. // Но наверняка есть ситуации когда реально сейчас можно торговать а через час нельзя - тогда неправильный ответ :( }
/// Ждём разрешения торговатьvoid TradeAllowed()
{
symb=Symbol();/// Текущий символ или символ на котором нужно произвести проверкуif(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
{Print("Automated trading is forbidden at the trade server side");return;}
if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
{Print("Trading is forbidden!");return;}
if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
{Print("Check if automated trading is allowed in the terminal settings!");return;}
if(!IsTradeAllowed(symb,TimeLocal())
{Print("Trading on the symbol "+symb+" is forbidden!");return;}
while(IsTradeContextBusy())
{
if(IsStopped()) {Print("Forced shutdown ");break;}
Print("Trading is occupied. Wait.");
Sleep(1000);
RefreshRates();
}
}
//------------------------------------------------------------------ IsSessionOpen bool IsSessionOpen(string smb) { //MqlDateTime dt; datetime tc=TimeTradeServer(dt); datetime tc= TimeCurrent(); // проверяем время торгов по инструменту datetime t=(datetime)SymbolInfoInteger(smb, SYMBOL_EXPIRATION_TIME); if (tc>t && t>0) return(false); t=(datetime)SymbolInfoInteger(smb, SYMBOL_START_TIME); if (tc<t && t>0) return(false);
// проверяем сессии инструмента datetime ds=tc/(60*60*24); ds*=(60*60*24); // начало сегодня datetime sec=tc-ds; // число секунд от начала дня bool b=false; for (int l=0; l<10; l++) // подразумеваем, что админ сделал не более 10 сессий в сутки { datetime fs, ts; if (!SymbolInfoSessionTrade(smb, TimeDayOfWeek(TimeCurrent()), l, fs, ts)) break; // данные сессии if (sec>=fs && sec<=ts) return(true); } return(false); }
自分をだましたい、だまされたいという気持ちが根強くあるのでしょう :) .
追記:全てのシンボルを表示し、「マーケット概要」ウィンドウの「時間」欄を表示し、ノンストップで取引されているビットコインシンボルを発見してみましたが、いかがでしょうか?また、このような基本的なチェックも有効です。
万能ではありませんが、私には合っています。
bool CanTrade()
{
bool res1=IsTradeAllowed(Symbol(), TimeCurrent());
bool res2=IsTradeAllowed(Symbol(), TimeCurrent()+4000); //с запасом,
if (!res1) return false; //сейчас торговать запрещено
if (res1 && res2) return true; //и сейчас и через час торговать можно
return false; //если зависло разрешение от TimeCurrent, то через час (или с запасом в несколько минут) покажет фалсе.
// Но наверняка есть ситуации когда реально сейчас можно торговать а через час нельзя - тогда неправильный ответ :(
}
しかし、確かに1時間後ではなく、今本当に取引できる状況もあるはずです
もちろんそうです。毎回マーケットクローズの1時間前です。)
私はそうは思いません。画面に表示される最終凍結日は金曜日21:59です。シフトを3600秒に設定すると、第2パラメータIsTradeAllowed(Symbol(),TimeCurrent()+3600) はtrueを返します。秒単位で追加していくことで、うまくいくようになりました。まあ、金曜日の21時50分であれば、すべてうまくいくはずです。
正直なところ、私はそれを確認せず、週末に必ず再接続するブローカー・リコネクター(フォーラムのどこかで見つけた)の接続を確認しただけです。だから、私にとっては意義がないんです。
bool MarketOpen(string Symbl)
{
if(IsTradeAllowed(Symbl,TimeCurrent()+1)==false)return(false); //рынок закрыт
return(true);
}
bool MarketOpen(string Symbl)
{
if(IsTradeAllowed(Symbl,TimeCurrent()+1)==false)return(false); //рынок закрыт
return(true);
}
様々ですので、このチェックは何かを保証するものではありません。
だから、専門家による取引は禁じられているが、市場は開かれている。
さて、月曜日は市場が開いていて、専門家は事務所から出入り禁止になっている。
逆に、市場が閉まって いる週末に、市場が開いていて専門家に取引許可が下りていることを示すチェックが行われるところもある。
昨日
今のところうまくいっています。
これはないですね。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
週末に取引がないことを知るにはどうしたらよいですか?
レナト・アフティアモフ 2018.02.11 05:27
ありがとうございました。
MT4用です。
bool IsSessionOpen(string smb)
{
//MqlDateTime dt; datetime tc=TimeTradeServer(dt);
datetime tc= TimeCurrent();
// проверяем время торгов по инструменту
datetime t=(datetime)SymbolInfoInteger(smb, SYMBOL_EXPIRATION_TIME);
if (tc>t && t>0) return(false);
t=(datetime)SymbolInfoInteger(smb, SYMBOL_START_TIME);
if (tc<t && t>0) return(false);
// проверяем сессии инструмента
datetime ds=tc/(60*60*24); ds*=(60*60*24); // начало сегодня
datetime sec=tc-ds; // число секунд от начала дня
bool b=false;
for (int l=0; l<10; l++) // подразумеваем, что админ сделал не более 10 сессий в сутки
{
datetime fs, ts;
if (!SymbolInfoSessionTrade(smb, TimeDayOfWeek(TimeCurrent()), l, fs, ts)) break; // данные сессии
if (sec>=fs && sec<=ts) return(true);
}
return(false);
}
は、何か5P機能が働いていないような気がします。
(なぜだろう?)
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/cterminalinfo/cterminalinfoistradeallowed