//переводит котировку в цену/1_лот в валюте депозита, например 0.00015 для EURUSD будет равно $15/лот bool Quote2Price(double diff,double &price4lot,string symbol="EURUSD") { int dig=(int)MarketInfo(symbol,MODE_DIGITS); if(dig == 0) return(false); // symbol is none double tickSize = MarketInfo(symbol, MODE_TICKSIZE); // пункт в валюте котировки (0,00001 для EURUSD на 5-знаке) //double tickValue = MarketInfo(symbol, MODE_TICKVALUE); // пункт в валюте депозита ($1 для EURUSD на 5-знаке) double tickValue; if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)) // пункт в валюте депозита ($1 для EURUSD на 5-знаке) Print(__FUNCTION__, " SymbolInfoDouble(...) returns false"); // всегда возвращается true!! Print("tickSize= ", tickSize, " tickValue= ", tickValue); if(tickValue == 0.0) // исключений нет, терминал врет, надо тупо везде проверять на деление на ноль... returnfalse; double price=diff/(tickSize/tickValue); // а то завалимся c tickValue == 0 price4lot=NormalizeDouble(price,2); return (true); }
OnCalculateをOnTickに置き換えた場合、エラーは発生しません。問題はSymbolInfoTickではなく、インジケータがスキップなしを適切に設定できていないことです。
測定にはどれくらいの時間がかかりましたか?それと、指標の設定 とはどういう関係があるのでしょうか?現在のティックの到着時刻は10、前のティックの到着時刻は11です。これは、現在値を返さない関数のエラーです。現在の時間値が以前の時間値より小さくなることはありえないということに同意するのですね?
SymbolInfoTick は、インジケータと EA で異なる動作をします。
インジケータでは、常にOnCalculateの呼び出しの開始点であったティックを返します。そして、インジケーターのこのイニシエーター・ティックを省略してはならない、これが開発者の思想です。問題は、このダニの行列の形成にある。
EAでは、OnTickのSymbolInfoTickは、OnTickの呼び出しを開始したティックを返すのではなく、現在の状態を完全に要求するものである。
Siで10分計測。
SymbolInfoTick は、インジケータと EA で異なる動作をします。
インジケータでは、常にOnCalculateの呼び出しの開始点であったティックを返します。そして、インジケーターのこのイニシエーター・ティックを省略してはならない、これが開発者の思想です。問題は、このダニの行列の形成にある。
Expert Advisor では、OnTick の SymbolInfoTick は、OnTick の呼び出しを開始したティックを返さず、現在の状態を完全に要求します。
Siで10分計測。
第三に、たとえSymbolInfoTick()がOKでも、CopyTicks()よりもよく機能し、より最新の値が返されることが多いからです。
LATERと呼ばれるSymbolInfoTickよりもCopyTicksの方が新しいデータを与える状況を捕捉しました。そのため、一度に2つの関数でクエリを作成し、その中から最新のティックを選択するようにしています。
SymbolInfoTick は、インジケータと EA で異なる動作をします。
インジケータでは、常にOnCalculateの呼び出しの開始点であったティックを返します。そして、インジケーターのこのイニシエーター・ティックを省略してはならない、これが開発者の思想です。問題は、このダニの行列の形成にある。
Expert Advisor では、OnTick の SymbolInfoTick は、OnTick の呼び出しを開始したティックを返さず、現在の状態を完全に要求します。
ならば、それを補完するのが筋というものでしょう。
特にお金がかからないので、原因となったダニと一緒に。
また、SymbolInfoTick()関数は IndicatorとExpert Advisorに完全に実装されるべきです(OnCalculateの 呼び出しの瞬間の価格ではなく、現在の価格を返します)。
MT4は予測不可能で驚かされ続けている ))取引機能の実装は誰が書いているのですか?MT4ビルド1045
まずはユーモラスな情報から。ザドルノフに送るべきですね。彼はいつも愚かなアメリカ人について話していますからね。
シンボリックトレードティック値
値 SYMBOL_TRADE_TICK_VALUE_PROFIT
二重
シンボル・トレード・チック・バリュー・プロフィット
非対応
二重
シンボル・トレード・チック・バリュー・ロス
非対応
二重
一方、SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)は値を生成する。しかし!!!!!!!チャート上にインジケータを投げると、起動時にOKになります。また、ターミナルを再起動すると、この関数は最初の呼び出しでtrueを返してtickValueがゼロになります!エキスパートアドバイザー開発者の皆さん、気を抜かずに、全ては自分の手で確認しなければなりません。
bool Quote2Price(double diff,double &price4lot,string symbol="EURUSD")
{
int dig=(int)MarketInfo(symbol,MODE_DIGITS);
if(dig == 0)
return(false); // symbol is none
double tickSize = MarketInfo(symbol, MODE_TICKSIZE); // пункт в валюте котировки (0,00001 для EURUSD на 5-знаке)
//double tickValue = MarketInfo(symbol, MODE_TICKVALUE); // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
double tickValue;
if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)) // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
Print(__FUNCTION__, " SymbolInfoDouble(...) returns false"); // всегда возвращается true!!
Print("tickSize= ", tickSize, " tickValue= ", tickValue);
if(tickValue == 0.0) // исключений нет, терминал врет, надо тупо везде проверять на деление на ноль...
return false;
double price=diff/(tickSize/tickValue); // а то завалимся c tickValue == 0
price4lot=NormalizeDouble(price,2);
return (true);
}
退出する。
2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0
2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0
2017.02.07 16:08:24.515 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0です。
2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0です。
2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: 初期化されました。
2017.02.07 16:08:23.002 カスタム インジケータ ShowImportantParams EURUSD.e,M15: ロードに成功しました。
それなら、補足するのが筋だろう
特にコストがかからないので、それを呼び出したダニで
また、SymbolInfoTick()関数は IndicatorとExpert Advisorで完全に機能する必要があります(OnCalculate 呼び出しの瞬間の価格ではなく、現在の価格を返す)。
現在のキューにティックナンバーを追加することにさえ意味があるのです。