KimIVの便利な機能 - ページ 8

 

いろいろと疑問はありますが...。
いつも出てくるけど、ケースバイケース。

今公開されている機能については、本体で「感じる」ことなく見るだけなので、何の疑問もありません。
また、それら以外にも、以前のコード、特にtrailingに関する質問もあり、これには
というようなことが書かれているのですが、この末尾の部分に戸惑いを感じました。

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}
ldStopLossの役割は不明です・・・。
 

うーーん:-)は、そんな古くからある機能です。オープンポジションやセットオーダーのストップレベルを変更するために設計されたものです。また、テイクプロフィットについても同様の機能があった。この2つは、より機能的で優れたModifyOrder() に置き換わりました。

kombat:
ldStopLossの役割は不明です・・・。

これはローカル変数で、StopLossが設定されるべき価格水準がModifyStopLoss関数に渡される手段です。例えば、ModifyStopLoss関数をこのように呼び出してみましょう。

ModifyStopLoss(1,5662);

すると、ローカル変数ldStopLossは値1.5662を取ります。このように確認することができます。

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
 
  Print("ldStopLoss=",ldStopLoss);
 
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}

ログにはこの記録が残ります。

<Время> <Эксперт> <Инструмент>,<таймфрейм>: ldStopLoss=1.5662
 
KimIV:

うーーん:-)は、そんな古くからある機能です。オープンポジションやセットオーダーのストップレベルを変更するために設計されたものです。また、テイクプロフィットについても同様の機能があった。この2つは、より完璧で機能的なModifyOrder() に置き換わりました。


それで...こき(ちょっと恥ずかしい:))フォルダをちらっと見たところ、一番古いファイルは2006.01.22の日付になっています。しかも、私のクランクに手を加えたわけでもなさそうだし...。 すみません、数字を変えるなど簡単な練習をずっと続けてきました。簡易計算機など...



きっかけは、あるPRDCのフォーラムでExpert Advisorを書きたいという要望があったことですが......。
私の銭では足りないが、市場で買わなければならない。
今、ハマっているのは...。便利なんだよなぁ...。全てはそこにある...コンパクトで持ち運びに便利なunitorなど。

Delphi 6に最初で最後に挑戦した時のことを思い出すと...。私は震え上がる。
今でもその円盤が何枚か棚にあるんだけど...。:)))オフトップで申し訳 ないです。


では、function()の括弧の中はどうなって いるかというと、何かパラメータを渡すための「形式」なのでしょうか?


なぜなら、関数が処理した結果として返す パラメータだと、なぜか頭の中で思い込んでいるからです。また、関数が中括弧の中に処理するためのパラメータを取得することです...{}。

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

つまり、これらのBidやPointなどは すべて入力パラメータである。

私は荒唐無稽な勘違いをしていたようだ...。そして、中括弧()の中にあるものは、関数にパラメータを渡すことができます。
一方、関数自体はスクリプトの適切なコードの任意の(あるいは他の)場所に配置することができます...。

そうだろ?

 
問題は、なぜOpenPositionと違って、ModifyOrderではエラー処理が ないのか?改造中にもいろいろなエラーが発生します。インストール、修正、クローズの機能を別々に用意し、エラー処理ユニットもすべて別にして、コードも少なく、書きやすく、動作も速くしたいのですが・・・。間違っていたら訂正してください・・・。
 
イゴール、こんにちは!私は、あなたのエキスパートアドバイザーとスクリプトを使用して、実際の(Alpari DC)上のトロールの任意のフォームを使用して問題があります。特に、e-News-Lucky$(私のシステムには理想的)、e-TFL_v2、Set2StopOrders、e-SotTrailingに関心があります。デモで動く(Alpariも)。エラーメッセージは ありません。それは何でしょう?そしてもう一つ質問です。e-News-Lucky$ のタイムバインディングを無効にして、いつでも入退場できるようにするにはどうしたらいいですか?ありがとうございました。
 
ag-forex писал (а):
イゴール、こんにちは!私は、あなたのエキスパートアドバイザーとスクリプトを使用して、実際の(Alpari DC)上のトロールの任意のフォームを使用して問題があります。特に、e-News-Lucky$(私のシステムには理想的)、e-TFL_v2、Set2StopOrders、e-SotTrailingに関心があります。デモで動く(Alpariも)。エラーメッセージはありません。それは何でしょう?
この証券会社のテクニカルサポートに問い合わせることで、何度も解決している。
 
kombat писал (а):
つまり、function()の括弧の中は、パラメータを渡すための「フォーム」のようなものなのですね。

そうですね...コンテナのようなものです :-)

kombat wrote (a):
なぜか頭の中で「これは関数が処理した結果として返す パラメータ」と逆になっているからです。

関数が返すものは、戻り値です。ここでは、簡単な例をご紹介します。2つの数値を足す関数を定義する。

int f(int a, int b) {
  int x;
  x=a+b;
  return(x);
}

さて、この関数をこのように呼び出すと。

int y;
y=f(3, 5);

とすると、3 と 5 は関数 f のパラメータである。関数のパラメータには、数値、変数、式があります。変数a,bはパラメータの値を受け取り、関数に与えるローカル変数 である。つまり、関数fを呼び出した後、変数yは変数xから渡された値、つまり8を受け取ります。

コンバット

また、関数が中括弧の中で処理されるパラメータを受け取ること...{}もそうです。

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

つまり、これらすべてのBid、Pointなどが入力パラメータとなる。

だめModifyStopLoss 関数のパラメータは、Bid-TrailingStop*Point 式の値になります。

コンバット

私は野暮な勘違いをしたようだ...。で、括弧()の中にあるのは、関数内で処理するパラメータを渡すことができます。
関数自体は、スクリプトのコード自体の任意の(あるいは他の)場所に置くことができます...。

そうだろ?

 
sasa999:
問題は、なぜOpenPositionと違って、ModifyOrderにはエラー処理がないのか、ということです。

交通ルールは血で書かれたものだと、どこかで聞いたことがある。そして、その中に余計なものは一切ない。その言葉の裏には、事故で失われた命がほとんどある。

私は自分の経験に合わせて、実務で発生したエラーの処理も含めて関数を書いているので、それを避けることはできません。市場に参入 しようとするときは、できるだけ「丁寧」(エラー処理)にすることを心がけています。修正時には、価格の正規化や数値の単純なチェックにより、ほとんどの誤差を排除している。修正中に何らかのエラーが発生した場合、次のティックでOKになります。閉店時も同様です。

 

この機能にpp-注文開始価格を送信する目的は何ですか?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

最初から色が決まっているような・・・。test_ModifyOrder.mq4(12.14 KB) ...これを使わず、関数に再送信するのはどうでしょう。

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи
なにがいいのか
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

短縮形以前

pp=NormalizeDouble(pp, Digits);

なぜOrderOpenPrice() を正規化する必要があるのでしょうか? オーダーと同じフォーマットではないですか?

op=NormalizeDouble(OrderOpenPrice() , dg);
今のところ、修正時に同じものが挿入されてもエラーにはなっていません。 OrderStopLoss()、OrderTakeProfit()も同様です。
 
sasa999:

この機能にpp-注文開始価格を送信する目的は何ですか?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELSTOPの各オーダーが移動します。

sasa999 です。

色も、最初の段階ですでに決まっているようなものですし...。test_ModifyOrder.mq4(12.14 KB) ...なぜそれを使用せず、関数に再送信するのですか?

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи

ありがとうございました。使わせていただきます!

sasa999 です。
なにがいいのか
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

たんしゅくぜん

pp=NormalizeDouble(pp, Digits);

現在のシンボルだけでなく、他のシンボルのポジションや注文を扱うことができる汎用性があります。例えば、EAがEURUSDチャートで動作する場合。Digitsを持つバリアントは、USDJPYで開いたポジションで作業することができません。

sasa999 です。

なぜOrderOpenPrice() を正規化する必要があるのでしょうか?

op=NormalizeDouble(OrderOpenPrice() , dg);

double 型の値をうまく比較するためです。正規化されていなければ、比較は不可能というか、意味がない。

sasa999 です。
修正時に同じものを入れ直してもエラーになりませんでした。OrderStopLoss()、OrderTakeProfit()も同様です。
正規化しなければ、この関数はエラー1(OrderModifyは すでに設定された値を同じ値で変更しようとする)を発生させます。