[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 60

 
7777877: パラメータ転送から参照によるパラメータ転送?

ここで、パラメータ 転送を参考に、このようなスクリプトを作ってみてください。

int start(){
   int res = 999;
   Print("func = ",func(res)," , res = ",res);
return(0);
}
//__________________________
int func(int &a){
   a = 10;
   return(a*10);
}

Expertタブには以下の記録が表示されます:2012.04.08 11:19:35 test EURUSD,M5: func = 100, res = 10

という質問に答えてみてください。

 

ライブラリの接続方法を教えてください。mqhファイルには存在するのですが、コピーする際に

'strlib.mqh' - プログラムファイルを開くことができません。

 
IgorM:

リンク先のパラメータ 転送ですが、このようなスクリプトを作成してください。

Expertタブに次のエントリーが表示されます。

そして、なぜres =999を 割り当てたのに、ログではres = 10になっているのかという疑問にも答えてみてください。


以下は私の説明です。

Print関数は、ユーザー関数funcを呼び出します。パラメータres=999はfunc関数に渡される。func関数そのものを評価する場合は、パラメータa=10が使用されます。値a*10=100はfunc関数が呼び出された場所に戻される。つまり,呼び出さ れた関数(この場合はfunc)に,関連する型(この場合はres=999)の任意の値を渡すことができますが,関数自体はその値ですでに評価されます(すなわち,res=10となります).(この値は,関数自体の内部で初期化されます(特定のケースでは,呼び出された関数,つまりこの場合はfuncに渡された値と一致することもあります).そして、関数内で計算された値(この場合はfuncに)を関数呼び出し文字列に戻す際、変数(この場合はres)はすでに以前とは異なる値、つまり関数funcの計算時に受け取った値(つまりこの場合はres=10)を持つことになります。つまり、関数にパラメータを参照渡しする場合、評価された関数内で、パラメータの値が変化する可能性があり、さらに、計算された値が関数呼び出し文字列で返された後、このパラメータは、呼び出された関数の評価中に受け取った、変化した(特定のケースでは、同じ)値を持っていることになるのです。

うまくいったかな?

 
7777877: パラメータが関数に参照 渡しされる場合,評価される関数内でパラメータの値が変更 されることがある
それはそうだ
 
IgorM:
そうなんです。

グロッセ・ダンケ・ショーン!!!!
 

注文の修正を行い、指定した時間に損切りの値を変更するようにしたいのですが、誤動作が始まってしまいますので教えてください。

以下は私のコードです。

extern int tp = 350; // 利益値 takeprofit
extern int sl = 400; // 損失値 stoploss

int ticket;

int start()
{
//----
if (OrdersTotal()==0 && Hour( )==2 & )& Minute( )==0) // 注文はターミナルタイム2:00にオープン
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Ask+sl*Point,Ask-tp*Point,".",123,0,Red);

//----

if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // ここでは、選択したチケットの注文は端末時間の3時に変更しなければならないという条件を設定しています。の時間です。

{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // ここでは注文の選択、取引を指定しています
OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue); //オープンポジション 価格から選択したチケットでの注文を変更、ポイントでSL値を変更、 TPは変更なし


}
//--。

}


テスト中に問題が発生しました。Expert Advisorは、3時00分から3時59分まで、時間的に多くの無駄な修正を行うようになりました。Expert Advisorは毎秒変更しています。なぜ、コードが間違っているのか?

 
oleg_felix:

教えてください。注文の修正を行い、私が指定した時間にEAがストップロスの値を変更するようにしたいのですが、誤動作が始まってしまいます。

以下は私のコードです。

extern int tp = 350; // 利益確定値
extern int sl = 400; // ストップロス値

int ticketです。

int start()
{
//----
if (OrdersTotal()==0 && Hour( )==2 && Minute( )==0) // 端末時間2:00に注文開始
ticket=OrderSend(Symbol()、OP_SELL、1、Bid、0、Ask+sl*Point、Ask-tp*Point、""、123、0、赤)。

//----

if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // ここでは、選択したチケットの注文を端末時間に合わせて午後3時に変更する条件を指定しました。

{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // ここでは、注文の選択、トレードを指定しています。
OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue); // 選択したチケットで、オープンポジション価格から注文を変更し、SL値をポイントで変更、TPは変更せずにおく。


}
//--

}


エキスパートアドバイザーは、3時00分から3時59分まで、時間内に多くの無駄な修正を行うようになります。Expert Advisorは毎秒変更しています。なぜ、コードがおかしい?



なぜオンタイムで...オンプロフィット!!!!

 

ECN口座のオープンオーダーで、ストップとプロフィットを一度に発注できず、修正で行う場合の正しい関数の書き方

何か問題があるようなので、エラーの原因を教えてください。

extern int tp = 350; // 利益値 takeprofit
extern int sl = 400; // 損失値 stoploss

int ticket;
int start()
{
//----
if (OrdersTotal()==0 && )Close[1]<Open[1] && High[1]<Bid) )==0) // 条件で注文開始
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,0,0t,",123,0,Red);
//----
if (OrdersTotal()==1) ) // ここでは、選択された1つの注文を変更する条件を設定しています。
{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // ここでは注文の選択、取引を指定しています
OrderModify(ticket, OrderOpenPrice(), Ask+sl*Point,Ask-tp*Point,0,Blue); //オープンポジション 価格から、選択したチケットで注文を変更、SL値をポイントで変更、 TPは変更なし
}
}.

 
oDin48:
  • みんな、ライブラリの接続はどうすればいいんだ?EAをコンパイルしようとすると、次のようなメッセージが表示されます。

  • 'strlib.mqh' - プログラムファイルを開くことができません。

Aラインを見つける。
#include <strlib.mgh>

と置き換えてください。

#include <stdlib.mgh>
 
7777877:

パラメータ参照渡しとは何か、わかりやすく教えてください。ドキュメントを読みましたが、可能であることと、変数の識別の後に修飾子&を付けることが義務付けられていることのみ理解しました。解説付きの小型プログラムがあれば最高なのですが...。通常のパラメータ渡しと、参照によるパラメータ渡しの違いは何ですか?

パラメータを 参照渡しする 一般的な意味は、変数そのものではなく、そのアドレスをパラメータに渡すことです。逆の場合は、変数のコピーがパラメータに渡されます。