エラー、バグ、質問 - ページ 379

 
Graff:

に意味があるのでしょうか?

rates_total を BarsCalculated(ich) に置き換える?

そんなことはないだろう。どちらかというと、バッファの準備をするためのサービススタブといったところでしょうか...。

また、Copyは要求されたサイズではなく、計算されただけのデータを返します。


また、秘密でなければ、どのような都市から来たのでしょうか?

Dneprではありません。
 
sergeev:

ところで、本当に追加の関数を呼び出す必要はないのでしょうか?

このライブラリは、RefreshとBufferResizeの両方を備えています。正常に機能するために必要なものだと思われます。


また、どこにそうあるべきと書かれているのでしょうか?

いろいろなバリエーションを試しました。

ichi.Refresh(true);
ichi.Refresh(false);
ichi.RefreshCurrent(true);
ichi.RefreshCurrent(false);

何の効果も得られなかった。

 

続き....

iIchimoku インジケーターに不具合が発生しています。私のインジケータは、if(tenkan[i]>kijun[i])に応じて矢印を描くだけです。スクリーンショットにあるように、矢印が正しく描画されていません。

完全なコードはファイル Ich_1_f.mq5 にあります。

ただし、手動で計算した場合は、すべて正しく表示されます

ファイル Ich_1_ok.mq5 のフルコード

ファイル:
Ich_1_f.mq5  6 kb
Ich_1_ok.mq5  6 kb
 

dllを書き込む :

#define _DLLAPI extern "C" __declspec(dllexport)
//+------------------------------------------------------------------+
//| адрес переменной double                                          |
//+------------------------------------------------------------------+
_DLLAPI int __stdcall
GetPtrVar(double a){return((int)(&a));}
//+------------------------------------------------------------------+
//| значение переменной double по адресу                             |
//+------------------------------------------------------------------+
_DLLAPI double __stdcall
GetValuePtr(int pointer){return(*(double*)pointer);}

プラグを差し込んでください。

#import "Projeckt1.dll"
int      GetPtrVar(double a);
double   GetValuePtr(int pointer);
#import

を呼び出す。

void OnStart()
  {   
   double var=153.25; 
   Print("вложенный вызов = ",GetValuePtr(GetPtrVar(var)));
   int pointer=GetPtrVar(var);   
   Print("вызов с сохранением адреса = ",GetValuePtr(pointer));
  }

を得ることができます。

2011.05.01 18:09:12     Черновик 31 (EURUSD,H1) вызов с сохранением адреса = 5.560304580319136 e-287
2011.05.01 18:09:12     Черновик 31 (EURUSD,H1) вложенный вызов = 153.25

という2つの行がありますが、どちらも同じ値153.25を返すはずです。

なぜ?

 
Urain:

なぜ?
これは32ビット版、64ビット版のどちらでしょうか?
 
Renat:
これは32ビット版、64ビット版のどちらでしょうか?

32
 

これは非常に簡単で、GetPtrVar(double a) 関数でスタックにある変数のコピーの アドレスを取得し、スタックメモリの散らばった部分を読み取ろうとするのです。

1回目はGetValuePtrのクローズコールのため、汚染されていないスタックから読み取ることができましたが、その後の関数呼び出しで スタックは取り返しのつかないダメージを受けました。

エラーはありません。

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 
Renat:

それはとても簡単で、GetPtrVar(double a) 関数でスタックにある変数のコピーの アドレスを取り、スタックメモリの散らばった部分を読み取ろうとするのです。

そう、まさに、どこかでそこを掘り下げないといけないと思ったんです。

は、DLLに記述する必要があります。

GetPtrVar(double &a){return((int)(&a));}
 
Renat:

これは非常に簡単で、GetPtrVar(double a) 関数でスタックにある変数のコピーの アドレスを取得し、スタックメモリの散らばった部分を読み取ろうとするのです。

1回目はGetValuePtrのクローズコールのため、汚染されていないスタックから読み取ることができましたが、その後の関数呼び出しで スタックは取り返しのつかないダメージを受けました。

エラーはありません。

私も気づきました。これが正しいやり方だと思います。

#define _DLLAPI extern "C" __declspec(dllexport)
//+------------------------------------------------------------------+
//| адрес переменной double                                          |
//+------------------------------------------------------------------+
_DLLAPI int __stdcall
GetPtrVar(double & a){return((int)(&a));}
//+------------------------------------------------------------------+
//| значение переменной double по адресу                             |
//+------------------------------------------------------------------+
_DLLAPI double __stdcall
GetValuePtr(int pointer){return(*(double*)pointer);}

プラグラミング:

#import "Projeckt1.dll"
int      GetPtrVar(double & a);
double   GetValuePtr(int pointer);
#import
 
Metatrader5の439ビルドでは、履歴品質インジケータが追加されました。M1やH4で始値や 全ティックでテストしていると、品質が51%になってしまうんです...。なぜ、どのように増やすのか?引用元はalpari demoです。
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5