どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 191

 
yan720:

ご回答ありがとうございました。そんな疑問がまったく湧いてこないことに、私自身驚いている。とはいえ、もしかしたら私が見たものと質問の原因を取り違えていたのかもしれませんが。

今は他の人のコードを見て、あるアルゴリズムを実装するためにどんな方法(私のとは違う、おそらくより効率的な方法)が使われているのかを見ています。今、私は悪名高いアイラン1.6 Expert Advisor(添付)を見ています。いろいろな部品から組み立て、再構築したことがよくわかります。しかし、337行目にはユーザー定義のトレイリングストップ関数が含まれている(ただし、冒頭でその使用のフラグが強制的にクリアされている)。この関数は52行目で呼び出されます。

私の疑問は、上記のトレーリングストップが、オープン オーダー(複数あり得ます)を、その最初のTakeProfitを維持したままストップロスで修正し、それらのオーダーにオープン価格として同じ値(173と178行目で計算されるAveragePrice)を設定することから生じます(OrderModify関数の2番目のパラメータ)。

それとも、未決済注文を修正する際に、そのパラメータ(オープン価格)は単にサーバーに無視され、サーバーは任意の価格を設定できるのでしょうか?

マーケットポジションを変更する場合、価格を設定し、開始 価格と同じにする必要があります OrderOpenPrise()

PS もし私があなただったら、このコードに「効率的なアルゴリズム」を探すことはしないでしょう。この人はそこで何をしているのかよくわからないままコードを書いているように見えますから...。

 
次のページへ
 Alert("Исполнение программы");
    double p[100];
    int i =0;
    int n = OrdersTotal ();
    int t =0;
    
    for (i=0; i<=n+1; i++)
    {
    
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
     {
     
      p[i+1] = OrderProfit();      // р - це прибуток ордера
     
     } 
    }
    for (i=0; i<=n+1; i++)
    {
    if (p[i+1]>0)                  // якщо ордер прибутковий, то його 
    {
      Alert("Є прибуток ордер ",i+1);
      OrderSelect(i+1,SELECT_BY_POS,MODE_TRADES); 
      Alert("Маємо помилку ",GetLastError());
      Alert("Вибрали ордер ",i+1);
      double ld_Price;
      if (OrderType() == 0) ld_Price = NormalizeDouble (Bid, Digits);
      else ld_Price = NormalizeDouble (Ask, Digits);
      OrderClose (OrderTicket(), OrderLots(), ld_Price, 2);  // треба зачинити 
      Alert("Маємо помилку ",GetLastError());
      Alert("Закрили ордер ",i+1); 
       if ( OrderType()==OP_BUY)                              //  в залежності від того, якого типу ордер ми зачинили
       { 
        Alert("Ордер типу бай");
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);   // змінюється порядок відкривання наступних ордерів
        Alert("Відкрили ордер типу селл");
        Sleep(10000);
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        }else
      {
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        Sleep(10000);
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);    
        Alert("Відкрили ордер типу селл");
      }
    } 
   } 
    Alert("Последняя ошыбка ",GetLastError()); 
//----
   return(0);
  }

その「愚かさ」を見つけてください、パスカルに拷問された男に慈悲を与えてください。

 
artmedia70:
成行ポジションを変更する場合、価格はポジションの開始価格と同じに設定されなければなりません:OrderOpenPrise()

そうすると、この機能は機能しないとお考えですか?テストしたわけではありませんが、動作しているコードの一部であるように思えます(このアイランは明らかにせいぜいデバッグされたものから作り直されたものです)。それとも、やはり粗悪なコードなのでしょうか?

void TrailingAlls(int pType, int stop, double AvgPrice) {
   int profit;
   double stoptrade;
   double stopcal;
   if (stop != 0) {
      for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber) {
               if (OrderType() == OP_BUY) {
                  profit = NormalizeDouble((Bid - AvgPrice) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Bid - stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal > stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Aqua);
               }
               if (OrderType() == OP_SELL) {
                  profit = NormalizeDouble((AvgPrice - Ask) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Ask + stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal < stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Red);
               }
            }
            Sleep(1000);
         }
      }
   }
}
 
こんにちは、あなたは戦略3 candles.tradeにExpert Advisorを記述 する必要がありますRenkoチャートで行われ、同じ方向に3連続バーが購入または売却するための順序を開くには、ストップロス、先行バーの上に置くクリアされていますキャンドルはprevedshegoバー上のストップロスを取った後、閉じます。
 
artmedia70:

PS もし私があなただったら、そのコードに「効率的なアルゴリズム」を探すことはしないでしょう。その人はそこで何をしているのかよくわからないままコードを書いたように見えますから...。

そう、このコードは冗長性が高く、それだけでなく非常に特殊なのです。しかし、私はアルゴリズムそのものに興味があるのではなく、その背後にあるアイデアを実現するためのアプローチに興味があるのです。全体像というか、そういうものを見ています。個々の機能に何が込められているのか、同じトレーリングアームでも自分のものと比べてどう実装されているのか、などなど。私は独学でやっているので、とにかく便利です :)
 
artmedia70:
正しい場所に - それはどの場所ですか?


例えば注文がすでに1200ポイントにある...そして価格例えば沈んでいたと星はすでにこの場所で注文が置かれなければならないように整列している...そして注文はすでにそこにあり、必要なものより下にバランスを下げないように、例えば、それぞれ二つの注文を入れてはいけません。
 
yan720:

では、この機能は使えないのでしょうか?テストしたわけではありませんが、動作しているコードの一部のように思えます(このアイランは明らかにせいぜいデバッグされたものから作り直されたものです)。それとも、やはり粗悪なコードなのでしょうか?

まあ...コードはマジでないんですけどね。少なくとも。

 
質問の本質は以下の通りです。標準のMACD簡易Expert Advisorを変更したいのですが、プログラミングは全くのゼロです。
EAを単一注文ではなく、グリッド、ストップ、マジックを使って動作するように変更したいのですが。
以下は、私が追加したかった変数です。
ストップロス=グリッド全体で同じレベルに置かれ、例えば、EUR/USD = 200ppに等しく、グリッド内のすべての注文について1.3450のレベルに置かれます。
MaxOnDer = グリッドの最大注文数、例えば=3ならグリッドの最大注文数は3
Dist = 2つの保留中の注文の間の距離

Lommultiplicator = グリッドの次のオーダーのロットサイズの比率です。

Magic=マジックナンバー

最初のコードと同様に取引を終了します。つまり、1番目の注文がクローズしたときに、グリッド内のすべての注文がクローズされることになります。

以上
誰かotvezvayutは非常に感謝される場合は!?
私は非常に感謝されるだろう!多分誰かがすでに生活の中で実装されている既製のエキスパート-アドバイザを、持っている、あまりにも、行います。
 
sannin:

例えば1200ポイントで既に注文が入っていて、例えば価格が下がって、この場所に注文を入れなければならないように星が並んでいて、注文は既にそこにあって、1つで2つの注文を入れないように必要な残高より下げないように、言ってみれば

こんな感じです。

//+----------------------------------------------------------------------------+
bool ExistOrdersByPrice(string sy, int op, int mn, double pp) {
   int i, k=OrdersTotal()-1;
   for (i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()!=op)          continue;
         if (MathAbs(OrderOpenPrice()-pp)<0.5*Point) return(true);
         }
      else Print("FUNC ExistOrdersByPrice() : ошибка выбора ордера "+GetLastError());
      }
   return(false);
}
//+----------------------------------------------------------------------------+

現在のシンボルにMagicで価格1.35000のBuyStop注文があるかどうかを確認するために、この関数を呼び出します

//+----------------------------------------------------------------------------+
   if (!ExistOrdersByPrice(Symbol(), OP_BUYSTOP, Magic, 1.35000)) {
      // тут код, если нет такого ордера
      }
   else {
      // тут код, если есть такой ордер
      }
//+----------------------------------------------------------------------------+
 
atztek:

ドキュメントの場合は、MetEditorで単語をハイライトしてF1キーを押してください。あるいは、オンラインなどで。
https://docs.mql4.com/ru/customind/SetLevelStyle

もちろんありがとうございます。でも、質問を読むのが面倒なら、答える意味はないでしょう?私の持っている2つの関数で、インジケータのレベルの値、太さ、色、スタイルを変更することができます。説明文にアクセスできない。もう一度聞きますが、誰か答えを知っていますか?見たことあるようなないような。

必要なものを示すために写真を添付しました。