コーディングの方法は? - ページ 114

 
matrixebiz:
EAで時間取引の時間を設定するにはどうすればよいですか?

私はこれを試していました。

int TradeHour;

if(Hour()17) TradeHour = false;

を試してみましたが、ルールには従っていないようです。

ありがとうございます。

TradeHourを整数の代わりにブール値で定義してみましたか?

bool TradeHour;

if ((Hour()17)){ TradeHour = false;}

さらに括弧を追加する必要があるかもしれません。

 
matrixebiz:
EAで時間取引の時間を設定するにはどうすればいいですか?

私はこれを試していました。

int TradeHour;

if(Hour()17) TradeHour = false;

しかし、それは規則に従わないようで、いつでも取引するだけです。

ありがとうございます。

Hour()はどのようにして9より小さく17より大きくすることができるのですか?Or (||) のことですか?

ラックス

 
luxinterior:
Hour()が9より小さく、かつ17より大きいとはどういうことでしょうか?Or (||) のことですか? Luxです。

グッドポイントluxinterior! それは確かに問題ですね。 私はそれを見逃していました。

 

すみません、||のことです。

で、これを試していたのですが

//+--------- 時間変数-------------------

// if (Hour() < StartHour) TradeHourS = false;

// if (Hour() > EndHour) TradeHourE = false;

つまり、StartHour=5, EndHour=17の場合、その時間帯にしか取引できないはずですよね?

でも、いつでも取引してしまうのはストラテジーテスターの 問題なのでしょうか?

 

なぜ、ヘルプファイルにある例をそのまま使わないのですか?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

ラックス

 

c/c++ DLL エクスポート関数から 文字列を返す

皆さん、こんにちは。

私は、EAから構成設定を管理するための一連の関数を開発しました。

これらの関数はc++のDLLによってエクスポートされ、エクスポートされた関数のそれぞれは、私のMQL4で要求された__stdcall呼び出しのコンベーションを持っています。

私の問題は、ある関数がEAに文字列を返す必要があるときに起こります。

当然ながら、その関数は以下のようなことはできません。

- ローカル変数へのポインタを返す(変数がスコープ外になる)。

- Dllグローバル変数へのポインタを返す(同時アクセスに問題がある)

- ヒープに確保された文字列へのポインタを返す(EAから呼び出されるメモリを解放する関数が必要:この方法は好きではありません)。

ということで、EAから文字列と文字列サイズを渡すことにしました。Es:

string buffer;

GetString( buffer, 30 );

[/CODE]

and from the c++ dll, something like this

void __stdcall GetString( LPTSTR buffer, int BufSize )

{

// Read a string from a some source

....

// -1 to take into account the terminating null character

StringCchCopy( buffer, BufSize-1, ReadStringFromASource );

}

[/CODE]

Here starts the weird behaviour of MQL managing strings returned from a DLL.

using the following code:

string buffer;

GetString( buffer, 30 );

the first time buffer contains the right string. A first question arises: buffer is not initialized but after calling GetString it contains the string returned. I have to suppose that MQL allocates space for a string variable when it's declared.

Next time GetString() is called the string returned seems to be truncated to the length-1 of the previous string length and not resetted as expected because of the 'string buffer;' statement.

Tried even:

[CODE]

string buffer = " "; // 'allocate' 30 blank characters

GetString( buffer, StringLen(buffer) );

but after the first time, when the execution returns to this code, the assignment of buffer does not work any more and buffer still contains the previous read string, and it seems it can only contains the number of characters of his content.

At first I have thought that the null character is not handled very well by MQL and modified the c++ code like this ...

[CODE]

CopyMemory( buffer, ReadStringFromASource, min(BufferSize,ReadStringFromASourceLength) );

と、終端ヌル文字を追加しないようにしました。

しかし、MQLから呼び出されたとき、全く文字列が返されません。

誰か答えを持っていますか?

 
luxinterior:
なぜ、ヘルプファイルから直接例を使用しないのですか?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

ラックス

ええ、私はそれを試してみました。

bool TradeHour=false;

if(Hour()>=12 || Hour()<17) TradeHour=true(トレードアワー=真)

というのは、もしHourが22であれば、最初の部分「if(Hour()>=12」を満たし、まだ好きなときに取引しているからです。私が与えた2番目の例は、トリックにする必要があります、私はそれを得ることはありません。

 
luxinterior:
ヘルプにある例をそのまま使えばいいのでは?

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

[/code]

Lux

12:00から17:00の間にトレードすることを目標とするならば、単純に以下のようにすればいいと思います。

[コード]

bool TradingEnabled=false; // グローバル変数

...

...

TradingEnabled=false; // チックランごとにリセットする。

if(Hour()>=12&& Hour()<17)

TradingEnabled=true;

...

...

if( 取引可能 )

{

// 取引ロジックはこちら

...

...

 
gorgoroth:
12:00から17:00の間にトレードするのが目的なら、単純に以下のようにすればいいと思います。

bool TradingEnabled=false; // Global variable

...

...

TradingEnabled=false; // Reset every tic run

if(Hour()>=12 && Hour()<17)

TradingEnabled=true;

...

...

if( TradingEnabled )

{

// Trading logic here

}

...

...

こんなことして同じことしてないかな?

if (Hour() 17) TradeHour = false;

つまり、時間が12から17の間であれば、TradeHour=trueということですよね?

(Buy/Sell文に&&TradeHourを追加しています)

 
luxinterior:
Hour()が9より小さく、かつ17より大きいとはどういうことですか?Or (||) のことですか? ラックス

というのは、あなたの言う通り、時間が9より小さく、かつ17より大きいことはありえないので、この文は偽になりますが、もし時間が10なら、それは9より小さくなく、かつ17より大きくないので、この文は真になります。

このようにするとMT4が混乱するかもしれませんが、とにかくこの方法でうまくいきます。

int TradeHour;

TradeHour = ((Hour()>=StartHour) && (Hour()<EndHour)));

ありがとうございます。