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

 

abeiks:

しばらくの間 私は で、最後の2つの 買いポジションだけを 閉じるように 買い クローズ ブロックを 作り直そうとして いますが、失敗して います ブロックの やり直し方法を教えて ください

最後の1ポジションを閉じる機能(ブロック)を作ると簡単で便利です。そして、2回実行する。ループで、あるいはただ並んで。
 
abeiks:

しばらくの間 最後の2つの 買いポジションだけを 閉じるために、 買い クローズ ブロックを やり直すことを 試して いますが、失敗して います ブロックの やり直し方法を教えて ください

少し前に、最後のポジションを見つけるための解法アルゴリズムを紹介 しました。そして、それをどうするかが重要です。STOPsを数える、削除する、修正する。少なくとも「イメージと似通った」コードを書けなければ、自分のもの(プログラミング)にはならない......。
 
rigonich:



ありがとうございました。

 
peshihod:
最後の1ポジションを閉じるための機能(ブロック)を作る方が簡単で、便利です。そして、2回実行する。ループで、あるいはただ並んで。

ありがとうございます!良いオプションですね!私も試してみます。

 
delf:

言い方が悪かったかな :(

注文を開始するためのアルゴリズムがあります。

最後の注文のクローズ時に、別の方向で次の注文が出されることが必要である。

すべてうまくいくのですが、例えば売りの場合、ストップロスで閉じていて、この方向で売りを開くという条件が揃うと、オープンが続いてしまいます。必要なのは、買うための条件を待つことだ。

つまり、最後に閉じた注文をチェックする必要があり、それが始値の注文と重ならないようにする(買い-売り-買い-売り交互)。注文か信号待ちのどちらか1つだけが動作しています。

OrdersHistoryTotal()を使うべきなのだろうということは理解できましたが、動作するEAではどのように見えるのでしょうか?

ありがとうございます。


これはおそらく、どこかの国でそうなっているのでしょう。しかし、履歴に多くの注文がある場合は、独自のオーダーブックを使用する方がよいでしょう。https://www.mql5.com/ru/articles/1404https://www.mql5.com/ru/articles/1390
//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void CloseOrder(string signal)
   {
   int      i,Ticket=-1,error; 
   double   Price;
   datetime time=0;
   for (i=0;i<OrdersHistoryTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ", error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic
      ||OrderClosePrice()==OrderStopLoss())
         {
         if(OrderCloseTime()>time)
            {
            time=OrderCloseTime();Ticket=OrderTicket();
         }
      }
   }
   if(!OrderSelect(Ticket,SELECT_BY_TICKET,MODE_HISTORY))
      {
      error=GetLastError();Print("Ошибка OrderSelect() = ",error);
   }
   if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL&&signal=="CloseSELL")return;
   if(signal=="CloseBUY")Price=NormalizeDouble(Bid,Digits);
   if(signal=="CloseSELL")Price=NormalizeDouble(Ask,Digits);
   for (i=0;i<OrdersTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ",error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic)
         {
         if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL||signal=="CloseSELL")
            {
            Ticket=OrderClose(OrderTicket(),OrderLots(),Price,0,CLR_NONE);
         }
      }
      if(Ticket<0)
         {
         error=GetLastError();Print("Ошибка = ",error);
      }
   }
   return;
}
       
 
peshihod:

より厳格なオプション

回答してくれた皆さん、本当にありがとうございました!結果は達成、まさに私が必要としていたものです。
 
delf:

言い方が悪かったかな :(

注文を開始するためのアルゴリズムがあります。

最後の注文のクローズ時に、別の方向で次の注文が出されることが必要である。

すべてうまくいくのですが、例えば売りの場合、ストップロスで閉じていて、この方向で売りを開くという条件が揃うと、オープンが続いてしまいます。必要なのは、買うための条件を待つことだ。

つまり、最後に閉じた注文をチェックする必要があり、それが始値の注文と重ならないようにする(買い-売り-買い-売り交互)。注文か信号待ちのどちらか1つだけが動作しています。

OrdersHistoryTotal()を使うべきなのだろうということは理解できましたが、動作するEAではどのように見えるのでしょうか?

ありがとうございます。

プログラミングを学ぼうと思ったら、他人のコードに目を通すか(そのためにCodaBaseがある)、問題解決のアルゴリズムから進めるか、どちらかでしょう。コードを書いてくれと頼むのは、最も絶望的な学習方法です。多くの場合、問題に対する不十分なコード化された解決策が得られるでしょう。(寓話的に)隣人が毎分ドアに電話してきて「あなたの名前は何ですか」と尋ねるようなもので、これは不必要な(余分な)計算のことです。

問題を解決するためのアルゴリズムは、次のようなものでしょう。まず、「自分の」注文がないかを確認する必要があります。この問題は、テスターでなければ(if (OrdersTotal() == 0)の条件に限定して解決できる)、OrderMagicNumber()とSymbol()にマッチするフィルターを使った注文の検索で解決します。そして、(あなたの戦略に従って)注文を開くための条件をチェックします。シグナルがあれば、OrdersHistoryTotal()の検索(通常はリストの最後のもの)を使って、最後に決済された注文のOrderType()を計算します。注文を開くシグナルと最後に決済された注文の種類が一致しない場合、シグナルに基づいて注文を開きます。

この方法は、最小限の計算で済み、テスターでのExpert Advisorの最適 化の時間を大幅に短縮することができます。

 
TarasBY:
少し前に、最後の位置の探索を解くためのアルゴリズムを紹介 しました。そして、それらをどうするかは重要ではありません:数える、削除する、修正するSTOP。少なくとも「イメージと似通った」コードを書けなければ、自分のもの(プログラミング)にはならない......。


そうですね、プログラミングは得意ではないので、ここで勉強しながら質問しています。あなたの アルゴリズムにポジションクローズを追加しようとしましたが、失敗しました(すべての買いポジションがクローズしていました)ので、別の角度から 問題にアプローチすることにし、 提供されて提供された既製のクローズブロックで最後の二つの買いポジションを閉じるという解決を見て みることにしました。

最後の2つの買いポジションを決済する方法を教えていただけるとありがたいです。自 分がどこを間違えたのか、理解できるようになる。

double profits_buy_2pos()
{
    int ordercount = 0, OpenOrders = OrdersTotal();
    double pr_buy = 0;
    for (int cnt = OpenOrders - 1; cnt >= 0; cnt--)   // scan all orders and positions. ..
    {
        if (!OrderSelect (cnt, SELECT_BY_POS)) return (0.0);
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != magic) continue;
        if (OrderType() != OP_BUY) continue;
        pr_buy += OrderProfit();
        ordercount++;
        if (ordercount == 2) break;
    } 
    Print ("::::::::::::::::::::::::: pr_buy2 = ", pr_buy);   
    Print ("::::::::::::::::::::::::: ordercount = ", ordercount);    
    return (pr_buy);   
}

 
TarasBY:

もしあなたがプログラミングを学びたいなら、他の人のコードを解析するか(そのためにCodaBaseがある)、手元のタスクのアルゴリズムに従えばいいのです。コードを書いてくれと頼むのは、最も絶望的な学習方法です。ほとんどの場合、タスクに最適なコードは得られません。(寓話的に)隣人が毎分ごとに呼び鈴を鳴らして「お名前は?」と尋ねるようなもので、これは不必要な(superfluous)計算のことです。

全く同感です。100%正解です。これは正しい方法であり、私はそれに従うようにした。しかし、教科書を持たずにMQL4を勉強し、意味もなく読んでいたのでは、何も生まれませんでした。自分のクレイジーなアイデアをほとんどプログラムに入れられないので、とにかく誰かのコードを解析する必要がありました。私は、...エクセルでストラテジーを組み始めました(その方が身近でわかりやすい)。戦略の基本については、(もちろん歴史の上では)非常に成功し、明確になっている。しかし、さらに私は取引の特殊性を考慮しなければなりません:変動スプレッド、スワップ、証券会社の特殊性、これらすべてをExelの数式に当てはめるのは難しいです。そこで、エクセルとMQLの利益の違いを分析してみることにしました。正直なところ、この差は大きすぎて、私にとっては不利な条件です。まだわかりません。各ポジションを分析し、もしかしたらExpert Advisorがミスを犯したかもしれませんが、それは私次第です。

とにかく、このフォーラムの良い人たちが、ある特定の問題を解決するために私を助けてくれました、なんと素晴らしい人間なのでしょうか、ありがとうございました。

 
Ekburg:

いいえ、ポジションの1つがクローズされたときに注文番号を変更する問題は解決しました。そこにエラーがあるかもしれないと思い、何度も確認しましたが、そこはすべて正常で、必要な注文が選択され、それに対してストップロスが正しく計算されて います。

エラー 1 は、OrderModify()関数に渡されたすべてのパラメータが、変更されるオーダーのすべてのパラメータと等しい場合にのみ発生し、チケット番号によって() またはOrderSelect() 関数が変更のために選択されます。チェックの使用例です。

KimIVからの便利な機能」のみ。

ModifyOrder()関数https://www.mql5.com/ru/forum/131859