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

 
qwert2:
エキスパートでスクリプトだけフォルダに移動したらどうなるかを書いてみました。機能するのですが、本来の姿ではありません。スクリプトは8つの保留注文を作成しますが、Expert Advisorsのあるフォルダに保存するだけでは、各ティック後に8つの保留注文が作成されます。古い注文が締め切られた後に、新しい8つの注文をする必要があります。

脚本に「延期」しか書いていないのでしょうか?そうすると、先延ばしになるだけです。ダニの数だけ入ってくるので...。然うは.........

その中に3つ目のチェッカーインヒビターを入れなければならない...。

 
qwert2:
スクリプトをexpertsフォルダに移動しただけでは、このような現象が起こります。動作はするのですが、本来の姿ではありません。スクリプトは8つの保留注文を作成しますが、expertsフォルダに保存するだけでは、各ティック後に8つの保留注文が作成されます。古い注文が締め切られた後に、新しい8つの注文をする必要があります。
これは質問には書かれていませんでした。スクリプトをExpert Advisorに変更する方法は問題ではありません。これも実装の一つです。
 
Roger:

間違いを発見しました。この関数のライブラリでは、以下の行に

は、13番目、14番目、15番目の各数字に0を削除する必要があります。


今、正しく



こんにちは、ライブラリ関数です。
 
Roger:

Нашел ошибку. В библиотеке для данной функции в строке
надо удалить по нулю в 13, 14 и 15 числе.

Теперь правильно
tara:
Hello ライブラリ関数。
ダメだ!標準ライブラリの 関数は触っちゃダメだディマは禁止されました :-))
 
artmedia70:

脚本に「延期」しか書いていないのでしょうか?そうすると、先延ばしになるだけです。ダニの数だけ入ってくるので...。然うは.........

禁止事項チェッカーを入れないと・・・。


)))))我慢できない)))))

よし、本題に入ろう。2つ目のTFのコードの最適化に取り組んでいますが、RateInfo構造体を1つのブロックに書くために、doubleをint[2]に変換することにしました。そこで、実現不可能な 方法も含め、可能な限りの方法を記載し、誰かが間違わないように注意することにしました。

1.WinAPI(msdn)。一般的に、変換機能というのはあまりないんです。これは、変換がc型変換を多用するためで、次のようなものです。

char s1;
char s2="g";//код ANSI 0x67
int i1=1357;//0x54D в шестн. представлении
int i2;

s1=(char)i1;//0x4D, "M", старший разряд (5) был усечён по границе байта (две шестн. цифры), остался один байт (0x4D, десятичное 77)
i2=(int)s2;//0x00 0x00 0x00 0x67, десятичное 103

次の行でint i1 が char に変換され、最後の行で char s2 が int に変換されています。 その結果、これらのものはすべて、いわゆる「変換関数」で使用されることになりますが、実際にはどのWinAPI DLにもなく、ヘッダー.hファイルで次のようなマクロを使って宣言されています。

#define _dtoi64(d)     (*((int64_t *)&(d)))
#define _dtoui64(d)     (*((uint64_t *)&(d)))

のように、コンパイル時にプリプロセッサで文字列に展開されます。しかし、ヘッダー.hファイルはdllではなく、開発環境(Studio、Borland、gccなど)でのみ使用されるものです。したがって、MQL4にとっては良くも悪くもない。しかし、その関数がヘッダ.hファイルの中でしか宣言されていないか、System32にあるいくつかのDLLの、詮索されないように隠されたエクスポート関数にあるかは、いつでも確認することができます。

2) WinAPI (CRT dll)。これらのDLLは、msvcp*, msvcr*, msvcrt*, msvci*, msvcirtという名前です。ここでは、_atodbl, _atoi64, _atoldbl, _ftol, _i64toa, _itoa, _ltoa, _strtoi64, _strtoui64 _ui64toa, _ultoa, atof, atoi, atol, strtod, strtol, strtoulと選択肢が広くなっています。名前に含まれる記号には、次のような意味があります。

a, str, w - string
f, l, i, ui, ul - int (4 байта)
d, dbl, i64 - double, int[2] (8 байт)
ldbl - int[2.5] (шучу) - 10 байт.

しかし、期待された_dtoi64/_dtoui64はまだありません。一方、msvcrt*, msvci*, msvcirt.dllの定義ファイルを使用する場合

istream::operator>>(double &)
ostream::operator<<(double)

は、ひねっても、ファイル操作としてしか利用できません(それらはコンソールです)。

msdnとは別にこのサイトでも検索が 可能です。こちらはサイト内検索バー です。同様の「便利な」msdnの検索文字列は こちらです。どのように違うのですか?msdnには機能についての記述がありますが、全くないものもあります(例えばNativeAPI)。一方、代替のものでは、あらゆるシステムDLLのエクスポートテーブルが存在しますが、説明はありません。基本的に、自分でDLLからエクスポートテーブルを引っ張ってくる(IDA、PE Explorerなど)よりも、ウェブサイト上のエクスポートテーブルのセットの方が簡単です。

3.アセンブラの挿入(正確にはマシンコードの挿入)。この点については、公式ドキュメントが非常に曖昧なので、少し説明します。MQL4におけるC++のインサート

asm{//или _asm{
   //
   //какой-либо ассемблерный код
   //
}

asm/_asmは関数ではなく、プリプロセッサー指示文であり、system32/*.dllのどこにも定義されていません(サイト内検索を参照ください)。つまり、そんなものはないのです。

#import "/Windows/system32/superpuper.dll"
   asm(string& item[]);//в строковый массив заносим команы ассемблера
#import

msdnのWinAPI-functionの定義によると、lpTimerFuncの ような関数/プロシージャへのポインタを渡す必要がありますが(フォーラムに完全な例が あります)、msdnでは次のように宣言されています。

UINT_PTR SetTimer(

    HWND hWnd,
    UINT_PTR nIDEvent,
    UINT uElapse,
    TIMERPROC lpTimerFunc//<-
);

またはlpfnWndProc (フォーラムに ある未完成の、msdn宣言とmql4構造体宣言の試み).他に方法はありません、MQL4はインタプリタです、関数のアドレスは存在しません、渡すものはありません、ただ機械語コードで書かれている場合のみです。そして,int型の配列にまとめられ,関数に参照渡しされる.

したがって、コンパイルされたアセンブラの挿入(つまりマシンコード)は、このタスクには適用できません - 彼らは完全に異なる範囲を持っています。もっとも、このようなint配列はshell32.dll経由でcmdのデバッグで実行することができます。 そこでコマンドラインを渡すことはできないようですが、keybd_event経由で仮想キーを使って書き込むことは可能です。

4.インサートなしの純粋なMQL4でdoubleをint[2]に変換する独自の関数を書いています。しかし、コードのサイズと性能を試算して、あきらめたんです。モジュール自体も書いていないのですが、アルゴリズムは以下のようなものだと思います。

1. Объявляем bool[64].
2. bool[0] равен 0, если плюс, и 1, если минус (отрицательное число то есть).
3. Находим значение выражения целая_часть(log_2(число))+1023. В цикле находим остатки от деления его на 2, заносим их в bool[11]-bool[1]
        в обратном порядке.
4. Разделяем целую и дробную чсти, сохраняем их в разные переменные.
5. Для целой части в цикле находим остаток от деления её на 2, пока не останется остаток от деления 1 или 0, заносим в этом же цикле значения
        в массив с bool[13+log_2(целая_часть)] до bool[12], в обратном порядке.
6. Для дробной части в цикле находим целую часть числа при циклическом умножении на 2. Целую часть запоминаем и отбрасываем, дробную умножаем дальше.
        Цикл до тех пор, пока при умножении в результате не получится 1. Заносим в прямом порядке, т.е. с начала (а начало на следующей ячейке после
        окончания пред. записи).
7. Теперь в цикле собираем в int[2] с конца bool[64], помня, что в int[0] идёт bool[0]-bool[31], а в int[1] идёт bool[32]-bool[63].
8. Ах, да, ещё BigEndian забыл.

実行には非常に長い時間がかかると思います。そこで私は、最終的に最も明白で簡単な解決策にたどり着きました。

5.C++で自作したDLLを使用。コードは以下の通りです。

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                                         )
{
    return TRUE;
}

__declspec(dllexport) void __stdcall dtoi(unsigned _int64 Dbl, int iDbl[2])
 {
        iDbl[0]=static_cast<unsigned int>(Dbl);
        iDbl[1]=static_cast<unsigned int>(Dbl>>32);
        return;
 }

スクリプトで。

#property show_inputs //для вывода окна с настройкой параметров

#import "double.dll"//самонаписанная dll
   void dtoi(double Dbl, int& iDbl[]);
#import

extern double Dbl=96.578;//в параметрах передаём любую double-переменную
int iDbl[2];//и выходной double->int[2] массив
int handle;//хэндл тестового файла

int start(){
   handle=FileOpen("test.txt",FILE_BIN|FILE_WRITE);//открываем тестовый файл как бинарный "только на запись"
   FileWriteDouble(handle, Dbl);//записываем в тестовый файл double-переменную (8 байт)
   dtoi(Dbl, iDbl);//вызываем функцию конвертации; в iDbl помещается разпарсенный double
   FileWriteArray(handle, iDbl, 0, 2);//записываем в тестовый файл int[2]-переменную (8 байт)
   FileClose(handle);//сначала идут 8 байт double, затем 4+4=8 байт сконвертированных int
   return(0);//Получаем перезаписываемый \experts\files\test.txt в 16 байт.
  }

Int upper[0]は参照渡しなので反転して います。得ることができます。

...うまくいきました、ダンプの行は同じです。添付のフォルダに、librariesにdouble.dll、samplesにsource dll、scriptsにscriptがあります。

夕方:アーカイブを再ダウンロードし、スクリプトとDLLのコードを少しいじった。

ファイル:
ftdqcs.zip  57 kb
 

何が悪かったのか理解できない。なぜか予定通りポジションが閉じない?

以下は、ポジションを開く基準です。

         if (Ask > iBands(NULL,0,M,2,0,N,MODE_LOWER,0)&& Low [1] < iBands(NULL,0,M,2,0,N,MODE_LOWER,1) && Hour()>=23 || Hour()<4)
         if (iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,0)> 20 && iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,1) < 20)
           {     
            Opn_B  =  true;     // Критерий открs. Buy
            OpenFunction ( Opn_B,  Opn_S, Lots);     //окрываем позицию
            
           }
         
         if (Bid < iBands(NULL,0,M,2,0,N,MODE_UPPER,0)&& High [1] > iBands(NULL,0,M,2,0,N,MODE_UPPER,1) && Hour()>=23 || Hour()<4)
         if (iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,0)> 80 && iStochastic(NULL,0,K,D,L,MODE_SMA,0,MODE_MAIN,1) < 80)
       
           {   
            Opn_S  =  true;     // Критерий откр. Sell
            OpenFunction ( Opn_B,  Opn_S,  Lots);     //окрываем позицию 
            
           }

以下は、ポジションを閉じる際の基準です。

if (Bid >= iBands(NULL,0,M,2,0,N,MODE_UPPER,0))    
         {                                                                      
         Cls_B  =  true;     // ... получаем критерий для закрытия позиции Buy
         CloseFunction ();     //исполняем функцию закрытия ордеров
         return;
         }
       
       if (Ask <= iBands(NULL,0,M,2,0,N,MODE_LOWER,0))       
         {                                                                      
         Cls_S  =  true;
         CloseFunction ();     //исполняем функцию закрытия ордеров
         return;
         }

と、こんな感じです。

 
Zhunko:
ダメだ!標準ライブラリの関数は触っちゃダメだディマは禁止されました :-))


なぜ、ここで道化を作るのか?エラーが発生した場合は、servicedkに報告するか、自分でコピーを作成する必要があります。
 
GaNDarM:

何が悪かったのか理解できない。なぜか予定通りポジションが閉じない?

以下は、ポジションを開く基準です。

以下は、ポジションを閉じる際の基準です。

と、こんな感じです。


また、クロージング基準のチェックはどの程度の頻度で行われているのでしょうか?ひょっとしてバーじゃなくて?
 
ilunga:

また、クロージング基準のチェックはどの程度の頻度で行われているのでしょうか?ひょっとしてバーじゃなくて?

質問の主旨がよくわからないのですが。始値 テストモデル(形成されたバーでのクイックメソッド)
 
WMZからQIWIにお金を引き出す必要がある。協力してくれる人を探している。5%程度のコミッションを取る用意がある
理由: