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

 
ShestkoFF писал (а)>>
もちろん、ブロックはしませんが。私なら、エラーをスルーして、どうするか決めていました。

この時点でブロックしてしまうと、このEAによるオープンポジションが残ってしまう可能性があり、大変なことになります。

これで、長いポーズについての自分の疑問が解けましたね。シグナルを待ってポジションを建てたり、注文を出したりするために行われるものです。

Vasilyさん、今回も私を見事に迷わせてくれてありがとうございました。あわててコード修正しそうになった...。そして、私の道を戻してくれたことに、改めて感謝します :-)

 
KimIV писал (а)>>

:-) これで、長いポーズについての自分の疑問が解けましたね。これは、ポジションを開く、または注文を設定するためのシグナルを待つために行わ れます。

Vasilyさん、今回も私を見事に迷わせてくれてありがとうございました。あわててコード修正しそうになった...。そして、私の道を戻してくれたことに、改めて感謝します :-)

正直なところ、その理屈は理解できない。
例えば、0.000001ロットで注文を出したとします。もちろん、サーバーから叩かれます。
ロット変更(関数外)の代わりに、一時停止をする。
このブレイクの結果、注文をセットするシグナルを失うかもしれませんが、待つのではなく、ロットを変更すべきです。
だからこそ、私はこの休止に納得がいかないのです。単純にこの関数を残して、エラーコードを上に渡して、そこで処理すればいいのです。
私のやり方で行けば、儲かるトレードを見逃さないかもしれませんよ。そして、損失も出るかもしれない :)

追記:不真面目な道を迷わせる :)

 
ロット計算関数は、エラーカウンタがオーバーフローしてからトップに行くのではなく、(トップに行くのではなく)すぐに呼ば れるべきであると思いました
 
Prival писал (а)>>
で、思ったのですが、ロット計算の関数を一度に呼んで(一番上には行かない)、エラーカウンタがオーバーフローした後に一番上に行く必要があります。

もちろん、すぐにこの関数を呼び出す必要がありますが、もしエラーが発生したら......!
トップへの出口 関数SetOrderを終了しなければならない状況を呼び出します。
私はおおよそ次のように考えています。


int ticket = SetOrder(......)。

if (ticket > 0) {

// 全てOK

} else {

// ロジックエラーの修正

}


int SetOrder(...) // チケットかエラー番号のみを負符号付きで返します。
{

int ticket = OrderSend(...)です。

if (チケット < 0) {

// セット順の誤りを修正する

}

}


ですから、ロジックのエラーと順番の設定のエラーは区別する必要があると思います。今日は、その実装例を紹介できればと思います。
 
ShestkoFF писал (а)>>
正直なところ、その理屈は理解できない。

ロットサイズ計算機能は、資金が足りない場合のみ不正なロット(ゼロ)を返すように作りました。また、ロットが正規化され、最小サイズと最大サイズの間の限界値で駆動する場合もあります。資金が足りなければ、どこかのポジションがクローズするのを待つしかない。

ShestkoFF さんが書き込みました(a) >> です。
0.000001ロットをご注文の場合。サーバーはきっと私たちに平手打ちをしてくれたのでしょう。

なぜ、そんなことをしたのか?なぜ、わざわざ間違った敷地面積を通したのか?どうしてこのような行動を正当化できるのでしょうか。

ShestkoFF さんは(a) >>を 書きました。

単純にこの関数を残して、エラーコードを上に渡して、そこで処理すればいいのです。

それで何が得られるのか?敷地面積が違ってくるのでしょうか?なぜ、すぐに適正な敷地面積を確保できなかったのか?理由を述べてください。分析しよう...
 

ただ、あなたの関数はライブラリ関数、つまり普遍的なものなので、すべてのエラーを2つのカテゴリーに分けるべきだと思うのです。

  • SetOrder関数内で処理されるべきエラー(接続エラー、再クオート...)。
  • SetOrder関数の外で処理されるべきエラー(ロットサイズの間違い、ストップの間違い...)。

Функцию расчёта размера лота я строю таким образом, что неверный лот (ноль) она выдаст только в случае не хватки денег. В остальных случаях лот нормализуется и загоняется в рамки между минимальным и максимальным размерами. Если денег не хватает, то надо ждать, когда закроется какая-нибудь позиция.

これは専門家の論理であり、他の人は違う論理を持っているかもしれません。そのため、ロット違いのエラーを外部
に出してしまいます。

エラーチェックブロック

それが、私の考えるこのケースのイメージです :)上にも書きましたが、今日は実装の例を挙げたいと思います。

 

私なりのファッション。



int ModeInt(int array[])
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid parameter in function ModeInt(int array[]). It should be at least one element.");
      return(0);
   }
   
   int buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   int maxValue = 0;
   
   int startIndex = 0;
   int startValue = buffer[0];
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] > startValue)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = buffer[startIndex];
         }
         
         startIndex = i;
         startValue = buffer[i];
      }
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = buffer[startIndex];
   }
   
   return (maxValue);
}
 
double ModeDouble(double array[], double interval)
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid first parameter in function ModeDouble(double array[], double interval). It should be at least one element.");
      return(0);
   }
   
   if (interval <= 0) 
   {
      Print("Invalid second parameter in function ModeDouble(double array[], double interval). It should be > 0 .");
      return(0);
   }
   
   double buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   double maxValue = 0;
   
   int startIndex = 0;
   double startValue = buffer[0];
   
   double sum = startValue;
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] >= startValue + interval)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = (sum)/max;
         }
         
         startIndex = i;
         startValue = buffer[i];
         sum = 0;
      }
      sum += buffer[i];
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = (sum)/max;
   }
 
   return (maxValue);
}
 
TheXpert писал (а)>>

私バージョンのMODです。


TheXpert 様、あなたのコードはとてもコンパクトに見えます。もちろん、それは大きなプラス要素です。>> ありがとうございました。

 
約束通り、私のバージョンの機能を掲載します。
この機能を使用したExpert Advisorを添付します。AI Expert Advisorをベースに使っています。
時間的に機能を確認する余裕がない。つまり、8分後に再度信号を確認する必要があると思います。
トレードサーバーのエラー発生を追加し、機能の詳細な動作確認とエラー検出を可能にしました。
int errTest[] = {0, 128, 0, 142, 0, 143, 0, 4, 132};
errTest - 生成されるエラーのシーケンス,エラーなし 0.これはランダムな配列であり、そこにキャッチは存在しない。


ご批判をお待ちしています :)

ファイル:
 
ShestkoFF писал (а)>>
約束通り、私のバージョンの機能を掲載します。
添付ファイルには、この機能を使用したEAが含まれています。AI Expert Advisorをベースにしています。
時間的に機能がどう動くか確認する余裕がない。つまり、8分経過後に再度信号を確認する必要があると思います。
トレードサーバーのエラー発生を追加し、機能の動作確認とエラー検出ができるようにしました。
errTest - 生成されるエラーのシーケンス,エラーなし 0.これはランダムな配列であり、そこにキャッチは存在しない。


批判を待っています :)

機能はどうでもよくて、一つ言えるのは :) オリジナリティがなく、相変わらずということです :)-- 過大な負荷がかかりすぎている。

その結果、Expert Advisorは32KBのすっきりとしたコードになり、いじる気にならなくなりました。


コードに疑問がある。

1.Expert Advisor を無効にすると、再起動するまで再び動作しなくなります。比較的長い時間待たせるのはいかがなものか。

2.ニューラルネットワークは、まずフラットの信号を出力することはありません。次に、閾値がないのにどうやって最適化するのでしょうか? 閾値がないと、すでに低い効率(リニアですが)の80%を殺してしまうことになります。



SZZH:気を悪くしないでください、私はこのスレッドで評論家として副業しているのです :) .