エラー、バグ、質問 - ページ 2452

 
A100:

配列をコピーするものは、a = b のルールではなく、ArrayCopy( a, b ) のルールで

自分で作ったのか、それともどこかに書いてあるのか?
動的配列を持つ構造体の暗黙の代入演算子 であることを忘れないようにしましょう.

 
Sergey Dzyublik:

自分たちで考案したのか、どこかに書いてあるのか。
これは,動的配列を持つ構造体に対する暗黙の代入演算 子の働きであることを思い出してほしい.

私のアイデアではなく、開発者のアイデアです。

        uchar a[], b[]; a = b; //Error: invalid array access
なぜエラーになるのですか?構造体にラップしたらエラーが消えた?その理由は?何が根本的に変わったのか?上記の私の回答
 
Alexey Viktorov:

それは、一連の行動や出来事を整理することに他なりません。

あなた自身がマニュアルから引用したもので、整合性は保証されないと書いてありますね。だからこそ、リスクがあるのです。

すでにVladimirのアドバイスに従ってコードを書き直し始めていますが、closingがtickより長い場合、つまり再びダブルカウントする場合につまずきました(カウント中のフィルターノードは非常に強引です)。今のところ、最適化速度との妥協のために、全閉前に停止する以上のことは思いつきません。

今日は金曜日です :)少し休んだら、何か考えるかもしれません。

いずれにせよ、アイデアをありがとうございました。

 
A100:

私のアイデアではなく、開発者のアイデアです。

どこに書いてあるのか理解できなかったが、気にしないことにする...。
チョリバーありがとうございました。

松葉杖でバックアップして、走り出す。

struct MyArray{
   uchar data[];
   
   void operator=(MyArray &bytes){
      ArrayCopy(this.data, bytes.data);
      ArrayResize(this.data, ArraySize(bytes.data));
   }
};


MyArray GetArray(int i){
   MyArray arr;
   
   if (i%2 == 0){
      ArrayResize(arr.data, 8);
      ArrayInitialize(arr.data, 0x8);
   }else{
      ArrayResize(arr.data, 4);
      ArrayInitialize(arr.data, 0x4);
   }
   return arr;
}


void OnStart(){
   MyArray arr_1 = GetArray(1);
   ArrayPrint(arr_1.data);        // 4 4 4 4
   
   MyArray arr_2 = GetArray(2);
   ArrayPrint(arr_2.data);        // 8 8 8 8 8 8 8 8
   
   arr_2 = arr_1;
   ArrayPrint(arr_2.data);        // 4 4 4 4            
}
 
Igor Zakharov:

あなた自身がマニュアルから引用したもので、整合性は保証されないと書いてありますね。だからこそ、リスクがあるのです。

すでにVladimirのアドバイスに従ってコードを書き直し始めていますが、closingが1tickより長い場合、つまり再びダブルカウントする場合につまずきました(カウント中のフィルターノードは非常に強引です)。今のところ、最適化速度との妥協のために、全閉前に停止する以上のことは思いつきません。

今日は金曜日です :)少し休んだら、何か考えるかもしれません。

とにかく、アイデアをありがとうございました。

私自身の一貫性の話でした。

私の観察によると、OnTickの後、取引が発生すると、次のtickを待たずにOnTradeTransaction 関数にコード実行が渡されることが判明しました。従って、自社機能による決済処理と OnTradeTransaction による決済処理に差はありません。しかし 私は OnTradeTransactionで 作業する 方が好きです。サーバーから送られてくるトランザクションの順序に依存することなく、操作の順序を正しく並べることが主なポイントになります。そして 、この順番を正しく 理解することが重要です。繰り返しになりますが、私自身の観察によると、シーケンスはトランザクションの種類で区切ることができます。つまり、TRADE_TRANSACTION_DEAL_ADDが 最初に実行され、次に TRADE_TRANSACTION_HISTORY_ADDが実行されるかもしれませんが、論理的には注文が最初に履歴に加えられ、次にトランザクションが加えられるはず です。

ps; それから、やはりTRADE_TRANSACTION_DEAL_ADD トランザクションをスクリーニングすることで、ポジションオープン、ポジションクローズでスクリーニング することができます。結局、外為市場用のExpert Advisorと口座の話でしょう?そのため、くしゃみのたびにすべての位置を再計算する必要はありません。開いた場合は1つ追加し、閉じた場合はカウントされたものから1つ削除すれば十分です。
 
Alexey Viktorov:

外為市場や口座の、ですね。

グリッド :)はい。

現在のロジックは以下の通りです。各グリッドに関するすべての情報を格納する構造体があります:シンボル、ポジション数、カム・ロット・プロフィット、その他いくつかの重要でないもの...。注文がある場合、タイマーで利益を再計算します(マルチシンボル・ロボット)。しかし、ロットと数量はOnTradeTransactionで 再計算されました(ユーザーが "手助け "した場合)。

例えば1つのグリッドが100$の利益で、もう1つが50$の損失である場合、それが拡大しないように50$の利益で両方のグリッドを閉じることを確認したいと思いました。

今のところ、そうしています。

void  OnTradeTransaction(
   const MqlTradeTransaction&    trans,     // trade transaction structure 
   const MqlTradeRequest&        reqst,     // request structure 
   const MqlTradeResult&         reslt      // response structure 
    )
{
 int index=-1;
 for(index=0;index<symbols_total;index++)
  if(ARRAY[index].symbol==trans.symbol) break; //нашли индекс символа по которому прошла трансакция в массиве структур
 
 if(index>=0) CountOrders(index); //пересчитали элемент
}

今のところ、いくつかのグリッドを閉じた後にCountOrders() を追加しています。ストラテジーテスターとしては、有効です。実際のアカウントでは、Vladimir のスキーム (クローズドチケットの配列) を使用します。

ところで、ペアのクロージングは、それ自体を正当化していない - 利益はきちんとカットしながら、ドローダウンが大幅に減少していません。

 
Vladimir Karputov:

ポジションを 閉じる作業のために、ALL while、Sleep、OnTimerをあきらめることになる。私なら次のようにします:クローズ注文を出し、OnTickを終了し、次のティックでチェックします:必要なチケットのあるポジションがまだ生きていれば、再びクローズ注文を出し、OnTickへの入口/出口を循環させるようにします。

ロジックは以下の通りです。ポジションのクローズが最優先されるため、クローズループはOnTickの一番最初にあります。また、クロージングチケットの配列の形成は、OnTickのどの場所でも、たとえ最後であっても可能です。

遅かれ早かれ、次のようなことになるでしょう。ポジションを閉じる必要があり、決済注文が送信され(MQL5)、つまり、適切なハンドラで取引行動を追跡していない(またはEAでポジション状態を保存していない)ため、逆のタイプの注文が送信され、次のティックで決済注文が送信中となり、別の注文を送ってしまう可能性があるのです。その結果、逆方向のポジションになる。

 
Alexey Kozitsyn:

遅かれ早かれ、次のようなことになるでしょう。ポジションを決済する必要があり、決済注文(MQL5)を送ります。つまり、対応するハンドラでトレードアクションを追跡しない(またはEAでポジション状態を保存しない)ため、逆のタイプの注文を送り、次のティックで決済注文が送信中であるかもしれませんが、別の注文を送ってしまったということです。その結果、逆方向のポジションになる。

そのような場合、私たちは

10036

トレード_レトコード_ポジション_クローズド

指定された POSITION_IDENTIFIERの位置は すでに閉鎖 されています。

クローズポジションは、クローズするポジションのチケットと一緒に送信されますので、ご記載のようなことは起こりえません。

 
Sergey Dzyublik:

どこに書いてあるのか理解できませんでしたが、気にしないでください...。
チョリバーありがとうございました。

松葉杖でバックアップして、走り出す。

まあ、配列がコピーされるのは不思議ですが、それが好きな人もいるくらいですから......。

配列の上に多少なりとも適当なラップを作り、問題はない。

https://www.mql5.com/ru/forum/221917/page26#comment_11233214

 
A100:

私のアイデアではなく、開発者のアイデアです。

そんなことを言われた覚えはない。

代入演算 子は、オブジェクトの同一コピーを作成するのが目的です。 それが目的です。 何かを何かに等化するとき、左側には明らかに完全なコピーが得られるはずです。 だから、ここには明らかにバグがあるのです。