EAコード2の問題(SLマネージャー) - ページ 3

 

このリンクは現段階では私よりずっと上ですが、私の問題に取り組むためにクールなライブラリファイルを作ることができるのはわかります... https://www.mql5.com/en/articles/1390.私は今、チケットアレイを構築することに少し神経質になっており、今のところ、それを回避できることを望んでいます。私が修正するとき、それはPairとMagicなどのすべてだけなので。

修正セクションに到達する前に、すべてを正しく実行しました。 チケットで正しく選択され、Modifyブロックに渡されます...その部分は素晴らしいです。

ただ、「この修正セクションで引っかかる場合」や「次の注文を取得するためにこれらのセクションを通過する必要がある」ために困っているのかがわかりません。

私はそれをモディファイ・ブロックに送って、そのマジック・ナンバーとシンボルのすべてのオーダーをモディファイさせることができると期待していたのです。 そこで、ちょっとしたtrue/falseスイッチを試してみました。

もし、「次の注文を選択する」ために、これらのセクションを毎回通過する必要があるのなら、私は困ってしまうかもしれません。

多分、私は修正する必要があるチケットに手動で名前を付けることができると思いますが、これは問題ではないと思います、それは正しくそれらを取得するので、それはちょうど毎ティック循環し、私はなぜ知っているnoobです...

これは別の選択肢でしょうか?

 for(int i=1; i<=OrdersTotal(); i++)
     { 
      if (OrderSelect(i-1,SELECT_BY_POS)
       executedpreviously = true;
       while(true)
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

continue;、return()、break;はどこかで役に立つのでしょうか?

 

あ、前の例のひとつにエラーがありました...。

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

私はそうあるべきだと思います。

bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && IfGap_SELLLevel_00AlreadyExe == FALSE)
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

これは、そのセクションでそれを分離する必要があります...午前5時なので、まだテストしていません...(1時間遅れで、くそ暑中見舞いだ...)

このセクションに一方的に通すと、すべてのティックで 最新のオーダーでオーダーモディファイがスパムされます...そしてもう一方の方法で通すと、オーダーは適切にスクロールされますが、それでもすべてのティックでオーダーキャッシュが修正されます...

5,4,3,2,1の逆方向や1,2,3,4,5の順方向に注文をスクロールさせることはできますが、スパムを出さずにすべての注文を修正するために通す方法が思いつきません。

1)通過する注文を全て修正するためには、一度通過させる必要があるのか・・・、2)新しい注文を選択する必要がある場合は、その都度通過させる必要があるのか・・・、疑問に思っています。

私はまだ勉強中です。 誰も正しい方向に私を導くことができない場合は、私はそれが終了するかどうかを確認し、休憩と終わりで、上記のこの行を試してみます...それはsoemthing簡単でなければなりません...

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

あなたは何のエラーも犯していません。最初の1つは、行くのにGOODです....

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) <--- this is GOOD to go..


もし私がこれを正しく読んでいるならば、私は以前かなり似たようなprbを持っていたかもしれません。私は、「Bid/Askがx Pips離れたら、MODE_STOPの最小値でストップ/リミットオーダーを 修正する」というのを作ろうとしていました。

あなたのケースは似ていますか?

 
diostar:

あなたは何のエラーも犯していません。最初の1つは、行くのにGOODです....


もし私がこれを正しく読んでいるならば、私は以前かなり似たようなprbを持っていたかもしれません。 私は、「Bid/Askがx Pips離れたら、MODE_STOPの最小値でストップ/リミットオーダーを修正する」というのを作ろうとしていました。

あなたのケースは似ていますか?



Diostarさん、ありがとうございます。保留中の注文の山を作り、次に成功した保留中の注文になると、古いストップを表示させるようにしようとしています。

そして、ブーリアン値にはFALSEではなく、"false "を使うべきでしたね...。 またその草稿を見つけて、"false "でやってみようかな...。 その例2では、注文をスクロールせず、ティックごとに 修正していたので、この変数を変更してもう一度試してみます。

しかし、それはすべてのティックを変更し、私が変更後に真または偽のフィルタを入れて、それはキャッシュ内の最初の順序を変更するだけです....

これは、EAが次の注文を取得するために、毎ティックこのブロックに到達する必要があることを示唆しています(このブロックに到達したときに、ここにそれを封印して、注文を一度回転させることができるかどうかわかりませんでした)...。

これは、真か偽の質問がそれを通過させないので、私に問題を提示します...

注文をキャッシュして選択する方法を学んでも、同じ問題が発生すると思います。 一度修正して次に進むようにしたのですが、最初の注文だけ取得して止まってしまいました...なので、実際に各オーダーチケットを指定してスイッチで使用するかどうか悩んでいます...。エラーメッセージを報告するためのbool OrderTicket()が、Pending_OrderTicket_XXの宣言も混乱させたのかどうか、よくわかりませんでした...。 単純なことなのでしょうが...

この問題はどのように解決されたのでしょうか?

 
void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


グローバル変数の宣言の仕方はともかく...

bool IfGap_SELLLevel_00AlreadyExe;

...それは一度、しかし、注文の一つだけを変更するようだ、私は注文をスクロールする方法で最後の順序を想定しています。

念のため、ret00 beforeorder ticketも取り除いて おきました...。

少なくとも、それはすべてのティックではありません、私はそれがまだ最初のフォーラムラの条件が真であるときに私の注文を介してスクロールする場合、この例を使用することができます(しかし、私の最も成功した試みが行うように、OKスクロール後のすべてのティック 'スパムの変更'ではありません...)

この試みもうまくいきませんでした。

**sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_TICKET))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
            if (Stoploss_Level_05 == 0) Level_05_SL = 0;
            double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
            if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
            OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

私はとにかく私がしようとしているものを明確に示し、私はこの上記のように動作することを望む、私はそうであれば行われていただろう...

私はとにかく正しい道を歩んでいることを望んでいます... 先ほどの例1がなぜ間違っていたのか、まだ理解できていません。 私は注文でプログラムするとき、私はそれが動作するように得ることができないので、私は再び完全に失われています...

何かご指摘はありますか?


EDIT: 本当に疲れてきたのですが、ちょうどこれを思いつきました、しかし、時間がなかったので後で試してみる必要があります...

void IfGap_SELLLevel_05()
{
    if (OrderSelect(SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
            if ((Gap_Level_05 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_05*PipValue*Point))
             || (Gap_Level_05 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_05*PipValue*Point)))
            
             {
              for (int i=OrdersTotal()-1; i >= 0; i--)
              if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                     if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01) 
                      { 
                       double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
                       if (Stoploss_Level_05 == 0) Level_05_SL = 0;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
                       if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
                       OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

は、分数点を扱っているのでしょうか?

 
diostar:

は、分数点を扱っているのでしょうか?


SLとTPの値を2倍にしたのは、SLとTPを設定するための価格が割り振られるようにということだと思います。 私はここでこれをやって間違っていなかったと思います。

MT4がそのブロックまで行ってくれればいいんですが、忘れてしまうんですよね...。MT4では表現が複雑になりそうな予感がしますが、引き続きチャレンジしてみます・・・。

 
Funky:


SLとTPの値を2倍にしたのは、SLとTPを設定するための価格が割り振られるようにということだと思います。 私はここでこれをやって間違っていなかったと思います。

ただ、MT4がそのブロックに到達して、それを忘れてしまうのは......。MT4では表現が複雑になりそうな予感がしますが、引き続きチャレンジしてみます・・・。

いいえ、私が言いたいのは、0.0001、または0.00001ポイントという4/5桁を扱っているかどうかということです。
 
diostar:
いいえ、私が言いたいのは、あなたは4/5桁を扱っています - 0.0001、または0.00001ポイント?


あ、5桁だ...。これ、さっきも使ったんですけどね...。

extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



で、さっきも思ったんですが、このDetect Digitsを最初のライブラリ挿入にしてみようかな、へへ、でも一歩ずつ、まずは這うことを覚えなきゃね、へへ。

エラーメッセージ130プライスで閉じるとかは出ていないのですが...。そんな簡単なものであればいいのですが・・・。

最後のページでは、例1が動作していましたし、他にも似たような例がたくさんありました。

私の以前の売り注文を 一度に取得しようとする代わりに、私はそれらのために新しいボックスを作成する必要があるのだろうか...ええ、私は本当に私の試みのすべての古い売りを循環し、それらを一度変更する方法を失っています。


&& (OrderStopLoss() < Stoploss_Level_00)

代わりに

!IfGap_SELLLevel_00AlreadyExe

あなたはDiostartの前に何かを示唆していることを知っていて、それは私が考えさせられました....

私は!IfGap_SELLLevel_00AlreadyExeのアイデアが動作しませんか(それは私がそのブロックをオフにロックする前に、同じパススルーですべての注文とそれらを修正するつもりはない場合)、私は前にあなたのアイデアを使用して、そこにこのような質問を置くかどうか疑問です...。 うまくいったらまたポチります。

もし私が間違った道にいるのなら、教えてください。)

 
Funky:


あ、5桁だ...。さっきから使ってるんだけど...。



で、さっきも思ったんだけど、このDetect Digitsを最初のライブラリ挿入に回してみようかな、へへ、でも一歩ずつ、まずは這い上がることを覚えなきゃね、へへ<--賢明な判断だ這っているんですね。ライブラリがあれば、必ず歩けるようになりますよ。

エラーメッセージ130プライスで終了とか出ないんだけど...。こんな簡単なものならいいのですが・・・。

最後のページでは、例1が動作していましたし、他にも似たような例がたくさんありました。ただ、1回のティックごとに変更できるようにしたいのですが...<--下記 参照

一度にすべての私の前の売り注文を取得しようとするのではなく、私はちょうどそれらのそれぞれのための新しいボックスを作成する必要があるのだろうか...ええ、私は本当に私の試みのすべての古いSELLSを循環し、それらを一度変更する方法を失っている。<---下記 参照。


このページが何らかの助けになる可能性はあります。

当初、私のシンボルは4桁で、すべてのトレーリングストップ、ストップ/リミットオーダーは修正し、予想通りになりました。 その後、私のブローカーは、小数部に行くことにしました。私は必要な変更を行い、私のピップが-3.4, -4.5, 0.1, 4.6, 7.3, etc.のようになったのを確認しました。 これは大丈夫だと思ったのですが、実はそうではありません。例えば、limit=7に設定し、新しいtick 1,tick 2,tick 3が順次発生したとします。

1) 7.3>limit の後、注文が修正され...ブローカーは1スリッページを埋め...

2) 7.5>limit, 次に注文が修正される...ブローカーはスリッページを0にする...。

3) 7.1>limit の後、注文を修正...ブローカーはスリッページを2つ埋め...。

というわけで、3つのティックについて3回注文が修正されることになる。このことに気づいたので、MathRound() を使って最も近い整数に丸めることにした。

1) mathround(7.3) =7 >限界、NOT TRUE、修正されない

2) mathround(7.5)=8 >limit, TRUE, 順序は変更される。

3) mathround(7.1)=7>limit, NOT TRUE, 修正なし

実は、私はまだ上記を改善する方法に取り組んでいます...今のところ、彼らは大丈夫ですが、私は私のものより、より良い方法があるはずだと思います。