[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 245

 
Vinin:

エラー処理は試されましたか?
いや、そんなことをして何になる?どうせまたクエリを作ることになる
 
AndEv:
いや、そんなことをして何になる?どうせなら、もう一回クエリーをやってくれ。

なぜデータがないのか、もしかしたらクエリーを繰り返しても無意味なのかもしれません。
 
AndEv:
いや、そんなことをして何になる?いずれにせよ、もう1度クエリを実行する必要があります
他の通貨やタイムフレームのどのようなデータが必要ですか?標準またはカスタムのインジケーター、価格、何か他のもの。成功しないコードの部分を教えてください。
 

念のため、聞いておこう。MQL4仕様について質問です。MSDNドキュメントによると、呼び出された関数がそのパラメータにポインタを持つ場合、MQL4ではパラメータの参照渡しを 使うことができますよね?

少なくともC++では

int a;//переменная
int *ra = &a;//адрес(* ra) равен ссылке(& a) на а (переменную)
 
paladin80:
他の通貨やタイムフレームのどのようなデータが必要ですか?標準またはカスタムのインジケーター、価格、何か他のもの。成功しないコードの部分を教えてください。
実は、OHLCの他には何も必要ないんです。コードのことではありません。オープンチャートでは、仮想メモリに時系列が作成され、受信したすべての相場は履歴ファイルに書き込ま れることなくワーキングメモリに保存されます。履歴ファイルは、MT4を閉じたときのみ書き込まれます。対応するチャートを開かずにデータを要求した場合、時系列は作成されませんが、ダウンロードしたデータは直接履歴ファイルに書き込まれます。このデータを取得するためには、再度クエリーを実行する必要があり、この場合のみ、(ファイルから)新鮮なデータを取得することになります。ファイルからではなく、RAMからデータを取得するために、グラフが開いている状態を何らかの方法でシミュレートしてみたかったのです。
 
AndEv:
実は、OHLC以外は必要ないんです。そして、それはコードのことではありません。チャートを開くと、仮想メモリ上に時系列が作成され、受信したすべての相場は履歴ファイルに書き込まれることなくメインメモリに保存されます。履歴ファイルは、MT4を閉じたときのみ書き込まれます。対応するチャートを開かずにデータを要求した場合、時系列は作成されませんが、ダウンロードしたデータは直接履歴ファイルに書き込まれます。このデータを取得するためには、再度問い合わせを行う必要があり、この場合にのみ、(ファイルからの)新しいデータを取得することができます。ファイルからではなく、RAMからデータを取得するために、何らかの方法でオープンチャートの存在をシミュレートしてみたかったのです。
正直なところ、そのようなプロセスには手を出したことがないんです。どんな作業に必要なんでしょうね。
 
paladin80:
正直なところ、私はそうしたプロセスを深く掘り下げたことがないんです。どんな作業に必要なんでしょうね。
3つの通貨を同時に取引するための、商品の選択、ウェイトの計算、エントリーポイントの発見という3つのタスクが1つになったものです。
 

gyfto: 

これで良いのでしょうか?

#import "kernel32.dll"
int GetModuleHandleA (string lpModuleName);//возвращает хэндл процесса; если lpModuleName=NULL то - текущего
#import

string lpModuleName;// неинициализированная строка содержит только /0, т.е. NULL
int hInstance;// передадим в CreateWindowExA

hInstance=GetModuleHandleA(lpModuleName);// аналогично GetModuleHandleA(NULL)


うまくいきそうだな...。以下は、インジケーターのコードです。

#import "kernel32.dll"//в комментариях типы данных в С++ :
int GetModuleHandleA (string lpModuleName);//LPCSTR, т.е. LP (указатель) на строку (STR) с завершающим /0, которая является константой (C). Имя модуля, возм. с path
//на выходе HMODULE (целое без знака, 4 байта). Дескриптор приложения (процесса)
int GetModuleFileNameA(int hModule,//HMODULE (целое без знака, 4 байта). Он же.
                        int& lpFileName[],//LPSTR, т.е. LP (указатель) на строку (STR) с завершающим /0. Это выходной параметр - path
                        int nSize);//DWORD (целое, 4 знака). Расчётная длина буфера.
//на выходе DWORD (целое, 4 знака). Длина строки с path
#import
#property indicator_chart_window

extern string    lpModuleName;//Path. Сейчас там '/0', то есть GetModuleHandleA возвращает дескриптор текущего управляющего процесса. Path задавать не через '/', a '\'.  
string path="";//инициализация пустой строкой
int lpFileName[64];//через string задать не получается. Почему не разобрался. 64 это 0х100/4 байта (длина int)=0х40=64.
int hModule;//для выхода функции GetModuleHandleA, т.е. дескриптора процесса
int nSize=255;//не 256, потому что последний 256-й символ по идее будет 0х00 = '/0' (максимальная длина строки)
int sizeFileName;// так обзовём выходной параметр с GetModuleFileNameA
int i;//счётчик цикла

int start()
  {
   hModule = GetModuleHandleA(lpModuleName);
   sizeFileName = GetModuleFileNameA(hModule, lpFileName, nSize);
   for (i=0; i<sizeFileName; i++){//конвертация int[] в string 
      path=path//конкатенация с проходом от 0 до sizeFileName-1, на каждом проходе обрабатываем по одному каждый байт:
            + CharToStr(lpFileName[i] & 255)//битовое and, обнуление старших разрядов. Н-р, 0xkkllmmnn&0x000000FF(т.е.255)=0x000000nn, т.к. x&0=0, x&1=x (0xFF=0b11111111)
            + CharToStr(lpFileName[i] >> 8 & 255)//сдвиг вправо на 1 байт (8 бит), потом обнуление старших разрядов. На выходе, как и в предыдущей строке, 1 (один) байт
            + CharToStr(lpFileName[i] >> 16 & 255)//сдвиг вправо на 2 байта (16 бит), чтобы получить третий в int байт, и обнуление старших разрядов. 
            + CharToStr(lpFileName[i] >> 24 & 255)// аналогично: на 3 байта (24 бит), четвёртый байт. Параллельно везде конвертация в string.
      ;
   }
   Print("hmodule = ", hModule, ", sizeFileName = ", sizeFileName, ", path = ", path);//в журнал.
   path="";//обнуляем строку на выходе, чтобы не было дальнейшей конкатенации по циклу
   return(0);
  }

ツールの初期パラメータに、アプリケーションのパスの代わりに「empty」を指定すると、出力時にそのハンドルとフルパスが(ログとして)返されます。そして...

 
gyfto:


合っているような気がするのですが・・・。以下は、インジケーターのコードです。

インジケーターの初期パラメーターには、アプリケーションのパスの代わりに「empty」が指定されており、出力では、そのハンドルとフルパスが(ログに)返されます。次は...

hModule = GetModuleHandleA(lpModuleName);
sizeFileName = GetModuleFileNameA(hModule, lpFileName, nSize);

なぜ、1行目は文字列バッファを 使用し、2行目は整数配列を使用しているのですか?

どちらの場合でも、初期化された文字列を使用することを妨げるものは何ですか?そうすれば、コードを十数行削減することができます。

 

Zhunko:

どちらの場合でも、初期化された文字列を使用することを妨げるものは何ですか?


ログによると、dll 'kernel32.dll'からの関数 'GetModuleFileNameA' の呼び出しが、7C902128 で文字列宣言の場合に重大なエラー c0000005 を発生しました。今でもその理由がわからない。表面的には、端末が開いてから3-7秒後にクラッシュし、ログに何かを書き込む時間がない、つまり、端末が勝手に閉じてしまう。