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

 
lottamer:


1) 理解できる

2) 今確認したところ、アルパリでは、ストップ&テイクはオープニングでは設定できず、その後の修正で設定するようです。

3)戦略がある。


それなら、ご指摘のようにシンプルですね。修正後、チェックボックスを設定し、修正前の状態を確認します。これは、注文が1つである場合です。複数ある場合は、自分で注文を計上する必要があります。やり方は記事欄で。
 
TarasBY:
私たち(凡人)には理解できない!?;)))



私の真空をちょっとだけ読んでみる )))
 

ロールオーバーで注文が再開された場合、ストップ値とテイクアウェイ値にスリッページが発生するかどうかアドバイスいただけますか? また、ロールオーバー後のオープン価格と ストップ値の差が、レベリングしたストップ値より小さい場合、ストップ値はどのように設定されるのでしょうか?

私の仕事は次のようなものです。成行注文がある場合、その注文がロールオーバーでオープンされたかどうかを確認し、オープンされた場合は、クローズされた前の注文のチケットを取得する必要があります。もしかしたら、どなたか検索アルゴリズムを教えてくれるかもしれませんね。 私は現在、以下のようにしています。

1.最初のオープンオーダーを選択します。
2.23:40から00:20に開かれたのであれば、さらにこの注文をチェックし続ける(40分の窓は念のため取っているが、理論的には23:50から23:59まで取ることができる)
3.チケット、ストップ、テイクプライスを覚えている
4. 履歴で、コメントにスワップという言葉が含まれていて、通貨ペアが一致するすべてのクローズドオーダーを確認する
5.ストップとテイクオーバーのデータを比較し、一致すればここで必要なオーダーペアとなり、一致しない場合はステップ1に戻る

 

答えは出ているのですが(個人的に)、歴史に残る投稿をします:))))

----------------------------------

が、ここからが面白いところ...。

あるスクリプト(オンラインで入手)があるのですが、これは未決済注文を修正するものです。

私のアイデアは、これを全体として捉え、ユーザー定義関数としてExpert Advisorに挿入し、必要なときに呼び出すことです。

問題は、コンパイラーが "'MB_OK' - variable not defined G:\Program_Files_2MT4-demo-experts33.mq4 (153, 37)" -最後から3行目のエラーを表示することです。

しかし、スクリプト自体をコンパイルすれば、すべてがクリアになるのです

MV_OCの正体はわかったのですが、スクリプトでは動くのにExpert Advisorでは警告されるのはなぜでしょう?

//+------------------------------------------------------------------+
//|                                               Изменить стопы.mq4 |
//|                                                          Мефодий |
//|                                                    ppc-2@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Мефодий"
#property link      "ppc-2@mail.ru"
#include <WinUser32.mqh>

extern  int  StopLoss = 500; 
extern  int  TakeProfit = 500;

// #property show_confirm
// #property show_inputs

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+

int start()
  {
        bool   result;
        double stop_loss,take_profit,point,bid,ask, lotsize;
        int    cmd, total, error, spread;
        string message;
//----
   total=OrdersTotal();

//----
   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         //---- print selected order
         OrderPrint();
         cmd=OrderType();
         point=MarketInfo(OrderSymbol(),MODE_POINT);
         bid= MarketInfo(OrderSymbol(),MODE_BID);
         ask= MarketInfo(OrderSymbol(),MODE_ASK);
         spread=MarketInfo(OrderSymbol(),MODE_SPREAD);     
         //---- buy or sell orders are considered
         if(cmd==OP_BUY || cmd==OP_SELL)
          {
            //---- modify first market order
            while(true)
             {
                if(cmd==OP_BUY){
                        string type = "buy";
                        if(OrderStopLoss()!=0)stop_loss=OrderStopLoss();
                        else stop_loss=OrderOpenPrice()-StopLoss*point;
                        if(OrderTakeProfit()!=0)take_profit=OrderTakeProfit();
                        else take_profit=OrderOpenPrice()+TakeProfit*point;
                }
                     
                else{
                        type = "sell";
                        if(OrderStopLoss()!=0)stop_loss=OrderStopLoss();
                        else stop_loss=OrderOpenPrice()+StopLoss*point;
                        if(OrderTakeProfit()!=0)take_profit=OrderTakeProfit();
                        else take_profit=OrderOpenPrice()-TakeProfit*point;
                }   
                result=OrderModify(OrderTicket(), OrderOpenPrice(), stop_loss, take_profit, 0, CLR_NONE);
                if(result!=true) { error=GetLastError(); Print("LastError = ",error);}
                else {error=0;}
                if(error==135) RefreshRates();
                else break;
              }
                if(error==0){
                        message=message+"Ордер #"+OrderTicket()+" - "+type+" - "+DoubleToStr(OrderLots(), 2)+" успешно модифицирован.\n";
                        }
                        else{
                                if(error == 130){string error_desc = " - Неправильные стопы";} else error_desc = "";
                                if(error != 1)
                        message=message+"Ошибка модификации ордера #"+OrderTicket()+" - "+type+" - "+DoubleToStr(OrderLots(), 2)+". "+error_desc+" \n";
                        }

              //---- print modified order (it still selected after modify)
              OrderPrint();
              continue;             
           }
        }
      else { Print( "Error when order select ", GetLastError()); break;}
     }
        int ret=MessageBox(message, NULL, MB_OK);
        //if(ret==IDOK) return(0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

その結果、#include <WinUser32.mqh> という行が存在しなければならないことが判明しました。

で、このファイルはincludeにあります。

 

われながら

を使えば、修正時にフラグは必要ありません。

if条件(例えばcross-means)で、関数BUYとMODIFYを括弧{}で囲んで使用することを参考にすれば良いのです。

といった具合に、両方のアクションに条件が伝搬していきます :))

このように

{My_buy ();

My_modify (); }.

 

lottamer:

このように

{My_buy ();

My_modify (); }.

このようなプログラムコードの緩やかな解釈は、明確にする必要があります。

    if (условие == true)
    {
        if (Tvoi_buy() == true)  // как вариант
        {Tvoi_Modify();}
    }
:)))
 
TarasBY:

このようなプログラムコードの緩やかな解釈には、明確な説明が必要です。

:)))


なんで

また、My_buy (非ブール変数) を TRUE-FALSE でチェックすることはできますか?

変更は確実に行われます - 注文はオープンです - ストップストックを設定する必要があります...

 
lottamer:

改造は確実に行われている - 注文はオープン - ストップスティークを設定する必要がある...

では、なぜ括弧 { } の中に if (例えばクロス平均) を入れたのでしょうか。
 

目の前でお母さんになるんだ!」。(つまり、家長になる!) :))

もうひとつは

注文を修正すると、その後に通知ウィンドウがポップアップして、注文が正常に修正されたことを知らせてくれるようになったのです。さらに、そのウィンドウが表示された後にEAを無効にすると、メッセージウィンドウでOKを押した後、EAは常にその動作(この場合、ポジションを閉じる)を修復するようになります。面白いことに、EAが消えても、そのコマンドはまだ実行されているのです。

少し考えて、行を削除する必要がありました。

message=message+"注文変更エラー#"+OrderTicket()+" - "+type+" - "+DoubleToStr(OrderLots(), 2)+"."+error_desc+"\n"

その後、すべてが元通りになりました。ウィンドウもなく、すべてが開いたり閉じたり...。が開いたり閉じたり...が開いたり閉じたり...

:))))))))))))

追伸

を削除しても

OrderPrint(); 

続ける

変わらない......線と同じだ。

if(ret==IDOK) return(0);

あってもなくても変わらない。

どうしてそうなのか