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

 

こんにちは。

MQLを勉強している間、いつもお世話になっています。

次の問題です.... この問題については、もうちょっとなんです。やりたいことは全てやっているのですが・・・。 しかし、GAPがこの基準を超えたら、一度だけ実行するのではなく、EVERYTICKでSLを変更するのです。

これは非常に単純なコードで、非常に単純な問題ですが、この段階で解決することができず、どんな助けも私の学習を助けるでしょう。

これは、現時点では買い側だけですが、後々のためにOP_SELL側のIFGAPの手当ては書いてあります。


このEAの機能は以下の通りです。

1.買いが存在しない場合、買いの取引を開始する。

2. TPレベル1で、SLを上に移動... TPレベル2で、またSLを上に移動... TPレベル3で、またまたSLを上に移動、前回。 本当にシンプルで良いですね。


私が抱えている素人的な問題点は

1.GAPを超えると私のOrderModify EVERYTICKを実行します。ロジックをどのように変更したらいいのか分かりませんが、一度教えてもらえば、今後のために なると思います。


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

皆さん、よろしくお願いします。


int start()
{
    if (Bars < 10)
    {
        Comment("Not enough bars");
        return (0);
    }
    if (Terminated == true)
    {
        Comment("EA Terminated.");
        return (0);
    }
    
    OnEveryTick();
    
}

void OnEveryTick()
{
    if (DetectBrokerDigits == false && FiveDigitBroker) PipValue = 10;
    if (DetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;
    
    IfGap_Level_1();
    IfGap_Level_2();
    IfGap_Level_3();
    IfBUYOrderDoesNotExist();
    
}

void IfGap_Level_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_2 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_2*PipValue*Point))) ||
            ((Gap_Level_2 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_2*PipValue*Point)))))
            {
                BuyOrderModifyLevel_2();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_2*PipValue*Point, price + BuyTakeprofit_Level_2*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_3 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_3*PipValue*Point))) ||
            ((Gap_Level_3 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_3*PipValue*Point)))))
            {
                BuyOrderModifyLevel_3();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_3*PipValue*Point, price + BuyTakeprofit_Level_3*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfBUYOrderDoesNotExist()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == InitialOrderType && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists == false)
    {
        Initial_BuyOrder();
        
    }
}

void Initial_BuyOrder()
{
    double SL = Ask - InitialBuyStoploss*PipValue*Point;
    if (BuyStoploss_Level_3 == 0) SL = 0;
    double TP = Ask + Initial_Takeprofit*PipValue*Point;
    if (Initial_Takeprofit == 0) TP = 0;
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, 0, 0, "My Expert", BUY_Magic, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, SL, TP, "My Expert", BUY_Magic, 0, Blue);
    if (ticket > -1)
    {
        if (true)
        {
            OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}



int deinit()
{
    if (ClearAllObjects) ObjectsDeleteAll();
    
    
}

 
Funky:

私が抱えているnoob問題は。

1.GAPを超えるとOrderModify EVERYTICKが実行されることです...ロジックをどう変えればいいのかわからないのですが、一度見せてもらえば、今後のことがわかると思います。

もし、毎ティック 実行しないのであれば、いつ実行するのでしょうか? 毎ティックだけど一度だけということでしょうか? そうするためには、SLとTPがすでに調整されているかどうかをチェックすればいいのですが.

もう一つのコメント.. .IfGap_Level_1() は、全てのオープンオーダーをループして、Symbol と Magic number にマッチするものを探し、オーダーが一定以上の利益を上げているかどうかをチェックします ... もしそうならBuyOrderModifyLevel_1() を呼び出し、 この関数は全てのオープンオーダーをループして Symbol と Magic number にマッチして 買いであるものを探します。 ここで少し繰り返しが見られますか? なぜIfGap_Level_1() からBuyOrderModifyLevel_1() にチケットナンバーだけを渡さないのか

 
Funky:

こんにちは。

MQLを勉強している間、いつもお世話になっています。

次の問題です....この問題については、もうちょっとなんです。やりたいことは全てやっているのですが・・・。しかし、GAPがこの基準を超えたら、一度だけ実行するのではなく、EVERYTICKでSLを変更するのです。

これは非常に単純なコードで、非常に単純な問題ですが、この段階で解決することができず、どんな助けも私の学習を助けるでしょう。

これは、現時点では買い側だけですが、後々のためにOP_SELL側のIFGAPの手当ては書いてあります。


このEAの機能は以下の通りです。

1.買いポジションがない場合、買いを開始する。

2. TPレベル1でSLを上げる...TPレベル2で再びSLを上げる...TPレベル3で再びSLを上げる。本当にシンプルで良いですね。


私が抱えている素人の問題は、以下の通りです。

1.GAPを超えると私のOrderModify EVERYTICKが実行されます。ロジックをどのように変更したらよいか思いつきませんが、一度見せてもらえば、今後のためになると思います。


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

Kind Regards and happy pips everyone.


あなたはNOOBではありません。関数を書いてから 呼び出すことができるエレガントな能力から判断して、あなたがやった方法です。あなたの関数呼び出し(ロジックの深さなど)は、おそらく1-2個の関数に簡素化できることを、あなた自身が見ることができるようになるはずです。

その代わり

OrderOpenPrice() 

の代わりに、

if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||

OrderStopLoss() を使うことを検討/試されましたか?

 
RaptorUK:

もし、毎ティック実行しないのであれば、いつ実行するのですか? 毎ティックだけど一度だけ実行するということですか? そうするためには、SLとTPがすでに調整されているかどうかをチェックするだけです ... ....

もう一つのコメント.. .IfGap_Level_1() は、すべてのオープンオーダーをループして、Symbol と Magic number にマッチするものを探し、そのオーダーが一定量の利益を上げているかどうかなどをチェックします ... もしそうならBuyOrderModifyLevel_1() を呼び出し、 この関数はすべてのオープンオーダーをループして Symbol と Magic number にマッチして 買いであるものを探します。ここで少し繰り返しが見られますか? なぜIfGap_Level_1() からBuyOrderModifyLevel_1() にチケット番号を渡さなかったのですか?

Raptorさん、またまたこんにちは。 私の言い方だと、確かに混乱しそうですね。 私はこれらのコンポーネントをすべて適切に結合するのに苦労しているのだと思います。 今のところ、私が抱えている主な問題は「ティック ごとに注文を変更している」ことなのですが、コメントをいただいて、他の問題も見えてきました。 最後の部分ですが、もし私が理解しているならば、BuyOrderModifyのコードをIfGap_Level_1内の{}に挿入し、それ自身の{}ではなく、Gapに達したかどうかをチェックすることでしょうか。 この下の例のように?


void OverGap1_soModify()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
               {
                double price = Ask;
                if (UseAskLineorNot == false)
                {
                 price = OrderOpenPrice();
                 }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

そして、あなたは知っている、私はボックスが形になっている今、ある意味で私の他のEAとdejavueのように感じている(ここhttps://forum.mql4.com/42870 - 異なる目的を持つ別のEAであるため、非故意類似、しかしこれは私が一緒に二つの機能を含むように学ぶ必要がある同じ領域を指摘している、私はフォーラムを冗長でいっぱいにしようとしていなかったと約束します)...。

したがって、私は同じ場所で変数IFNEWORDEREXIST = TRUEが別の問題を解決することができるかどうかを念のため尋ねることができます。 私は、ModeTradesで行われた最後のオープントレードを、常にIfGap_Level_Xと比較するものにしたいと思っています(この部分は、私の他の部分と同様だと思います)。


もし、上のボックスが正しくない場合、{}の中で止まっている間に、OrderModifyがEVERYTICKで起こるというエラーを修正し、Latest Order Select Issueを処理すると、IfGap_Level_3が満たされる一方で、IfGap_Level_2、IfGap_Level_1も満たされるという次のドラマに直面することになるのでしょう。

私はEAにSL管理者として機能させたいようなもので、(最初の一回の買い注文にもかかわらず)複数のトレードを管理するために使おうと思っています。 最初の購入は、私がバックテストを行うことができるようにしたものです。 私はこのコードにしたいです。

もしOrderのPipsがIfGap_Level_1になったら、BuyOrderModifyLevel_1に行き、既存の注文を修正し、この部分のコードを忘れて欲しいのです。

IfOrder's Pips gets to IfGap_Level_2, I want it to go to BuyOrderModifyLevel_2, then modify existing orders, and forget this part of the code.

注文のPipsがIfGap_Level_3になったら、BuyOrderModifyLevel_3に移動して、既存の注文を修正したいのですが、コードのこの部分は忘れてください。

最初は単純に感じたのですが、あまり外れていなければいいのですが。

各ブロックの最後に「break;」などを挿入すれば、このコードで済むと思っていたのですが...。
diostar です。

あなたはNOOBではありません。 あなたのように関数を書き、そして呼び出すことができるエレガントな能力から判断してください。 あなたの関数呼び出し(ロジックの深さなど)は、おそらく1-2個の関数に単純化できることを、あなた自身で見ることができるはずです。

その代わりに

という条件です。

OrderStopLoss() を使うことを検討/試されましたか?

diostarさん、ご親切にありがとうございます。 私は基本的なスクリプトを書くことはできますが、そのレベルには遠く及ばず、今、すべてを結合することは頭痛の種になっています。 しかし、このような励ましをいただき、ありがとうございます。

でも、このような場合、1-2個の関数にコードを凝縮することで、あなたの言っていることは正しいかもしれないと思います。

もし私に経験があれば、あなたとRaptorが提案しているように、IFGAPとMODIFY ORDERを1つのブロックにするのですが、現段階では安全策をとっていました...。もし私がプロなら、TPを配列かスイッチに置いて、old TP=oldTP+TPincrement_Level を設定し、10行程度のコードで1つのブロックにまとめると思います。最終的には最後のIf Gap & ModifyOrder {}でこれを行い、SLの増分がプログラム可能な間隔でステップアップするようにしますが、最初の数行は市場の状況に応じて手動で設定するようにしたいと思います...。

OrderStopLoss()を計算式に使うことは考えていません。 最初の数回はSLを少し変化させるので、本当はOrderOpenPriceとOpenしてからの上昇Pipsをベースにしたいのでしょう。 EAをうまく説明できていなかったようです。 お時間をいただきありがとうございました。

 
Funky:

Raptorさん、再びありがとうございます。私の言い方だと、確かに混乱しそうですね。私はこれらのコンポーネントをすべて適切に結合するのに苦労しているのだと思います。今のところ、私が抱えている主な問題は「ティックごとに注文を変更している」ということなのですが、コメントをいただいて、他の問題も見えてきました。最後の部分ですが、もし私が理解しているならば、BuyOrderModifyのコードをIfGap_Level_1内の{}に挿入し、Gapがそれ自身の{}にではなく、到達したかどうかをチェックするということでしょうか?この下の例のように?

そうすることもできますが、私が言いたいのはそういうことではないのです ... ...

これが意味をなすかどうか見てみてください.

          (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }
.
.
.


void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}

私が言ったもう一つのことは、SLとTPが何であるかを見ることによって、注文がすでに修正されているかどうかをチェック することでした。言い換えれば、もしあなたが最後のティックですでに注文を修正したなら、このティックで再びそれをしない ... それは、あなたがやろうとしていたことですか?

 
RaptorUK:

あなたはそれを行うことができますが、それは本当に私が意味するものではありません... ...

これが意味をなすかどうか、見てみてください.

私が言ったもう一つのことは、SLとTPが何であるかを見ることによって、注文がすでに修正されているかどうかをチェックすることでした。言い換えれば、もしあなたが最後のティックですでに注文を修正したなら、このティックで再びそれをしない ... それは、あなたがやろうとしていたことですか?


これは私の学習にとって素晴らしいものです...。そもそも関数名の後に(OrderTicket())を付けられるとは知りませんでした、かっこいい。 これで私の最新のOpen OrderのTicket Numberが表示されます。 これは私が今ハマっていることにとても便利なヒントです、ありがとうございます。

(OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }

そして、Ticketという変数を作りましたね。 実は、この部分で変数を宣言できることを知りませんでした。 これは、上記の最後の部分で値が指定されているからできることなのでしょうか? そうすると、私の「不特定」のOrderTicket()の代わりに、この最後のTradeのOrder Ticketの 番号をここで使うことになりますね。 それは理にかなっています。 これは、私にとってOrderSelect(i++...など)よりもずっと正確でしょう。

void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}


もう午前1時近くなので、明日じっくり見てみます。 このロジックは、「BuyModify{}」ブロックではなく、「If_Gap_Levels{}」に挿入しなければならないかもしれない予感がします。 説明不足でした、申し訳ございません。 このヒントで、その最新のチケットのGAPをチェックし、そのOP_BUYとBUY_Magicなどで過去の全ての注文をMODIFYすることができると思います。

もう一つは、SLとTPが何であるかを見ることによって、オーダーがすでに変更されているかどうかをチェックすることです。言い換えれば、もしあなたが最後のティックでオーダーをすでに変更しているなら、このティックで再びそれをしないでください ... それはあなたがしようとしていたことですか?

はい、実はまさにここが引っかかっているのです・・・。ただ、これをどのように指定すればいいのかがわからないのです...。 NeedsModifying = false というbool値を作っておいて、IfGapの条件を満たしたときにTrueに変換すればいいのでしょうか? ロジックは思いつくのですが、構文がわかりません。 Raptorさん、ありがとうございました。

 
Funky:

これは私の学習にとって素晴らしいものです...。そもそも関数名の後に(OrderTicket())を付けることができるなんて知りませんでした、かっこいい。 ということは、Gap条件を満たす私のTicketは、BuyOrderModifyLevel_1という関数に帰属するということですか? これは私が今ハマっていることにとても便利なヒントです、ありがとうございます。

そして、Ticketという変数を作ったのですね。 実は、この部分で変数を宣言できることを知りませんでした。 これは、上記の最後の部分で値が指定されているからできることなのでしょうか? そうすると、私の「不特定」のOrderTicket()の代わりに、この最後のTradeのOrder Ticketの番号をここで使うことになりますね。 それは理にかなっています。 これは、私にとってOrderSelect(i++...など)よりもずっと正確でしょう。

これは関数定義の一部です ... 標準的な関数と同じように、例えば OrderModify (https://docs.mql4.com/trading/OrderModify) OrderModify は関数で、変数を渡します。最低5つの変数で、6番目はオプションです。. .

どういたしまして。 おやすみなさい。

 
RaptorUK:

これは関数定義の一部です ... 標準の関数と同じように、例えば OrderModify (https://docs.mql4.com/trading/OrderModify) OrderModify は関数で、変数を渡します。最低5つの変数で、6番目はオプションです。. .

どういたしまして。 夜。


Raptorさん、ありがとうございます...最後の文章を編集しているときに、私を捕まえてくれましたね。

あのドキュメントを思い出させてくれてありがとう...OrderMofidyのあの特別なドキュメントを何度も読んでいるのは面白いわ...。以前は、そのマニュアルは中国語に見えたのですが、私が進歩するにつれて、より高度なヒントが目立つようになりました。 今、もう一度読んでみますが、あなたが言った機能は、きっと昼間のようにはっきりするでしょうね。でも、それを指摘したおかげで、それを探すことができました。

--あなたが書いている間に、私は知らずに最後の部分を編集してしまったので、上からコピーしました...。

私が言ったもう一つのことは、SLとTPが何であるかを見ることによって、オーダーがすでに変更されているかどうかをチェックすることでした。言い換えれば、最後のティックですでにオーダーを変更している場合は、このティックで再びそれをしない ... それは、あなたがやろうとしていたことですか?

はい、これはまさに私が実際に行き詰っているところです...。どのように指定すればいいのかわからないのです。 NeedsModifying = falseというbool値を作っておいて、IfGapの基準を満たしたときにTrueに変換すればいいのでしょうか? ロジックは思いつくのですが、構文がわかりません。 Raptorさん、ありがとうございました。

ダウンアンダーからおやすみなさい。

 
RaptorUK:

これは関数定義の一部です ... 標準的な関数と同じように、例えば OrderModify (https://docs.mql4.com/trading/OrderModify) OrderModify は関数で、変数を渡します。最低5つの変数、6番目はオプションです。. .

どういたしまして。 夜


Raptorさん、こんにちは。

教えていただいたアイデアをもとに、もう少し進めてみました。 あなたのコードが私の問題を解決してくれることに気づきましたが、注文が2番目のTPレベルに達すると、管理するのが難しくなります。

OrderSelect i++を削除して、その方程式で自分のTicketを選ぶことができるとは知らなかったので、複数の取引に関するすべての問題を解決するためにこれを試してみました。

もし誰かがこのコードが動作することを私に確認することができれば、私は嬉しく思います... サポートに再度感謝します;)

void BuyPendingOrder_1()
{
    int expire = TimeCurrent() + 60 * 0;
    double price = NormalizeDouble(Ask, NDigits) + PriceOffset_1*PipValue*Point;
    double SL = price - BuyStoploss_1*PipValue*Point;
    if (BuyStoploss_1 == 0) SL = 0;
    double TP = price + BuyTakeprofit_1*PipValue*Point;
    if (BuyTakeprofit_1 == 0) TP = 0;
    if (0 == 0) expire = 0;
    int PendingOrderTicket_1 = OrderSend(Symbol(), OP_BUYSTOP, BuyLots_1, price, 4, SL, TP, "EA_Pending_Order1", BUY_Magic, expire, Blue);
     ///--^^^----^^^ allocate this ticket number to PendingOrderTicket_1 above
    if (PendingOrderTicket_1 == -1)
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    
}

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1; ///--<<<----if PendingOrderTicket_1 is over Gap_Level_1, then proceed to BuyOrderMoidfyLevel_1 section etc
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1() 
{
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)  ///--<<<----select all trades of that pair and magic
    {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             ///--^^^^^^---- modify all trades of that pair and magic if it made it this far
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            
    }
    
}
 

あなたが提案していることを行うには問題があります ... ...

EAが動作していると想像してください ... その後、MT4が何らかの理由で中断された場合、停電、MT4のクラッシュ、PCの再起動が必要など ...PendingOrderTicket_ 1に正しい値がないため、あなたのコードは中断したところから拾えなくなります。

 
RaptorUK:

あなたが提案していることを行うには問題があります ... ...

あなたのEAが動いていると想像してください ... ... その後、あなたのMT4は、電源障害、MT4のクラッシュ、PCの再起動が必要など、何らかの理由で中断されます ... あなたのコードは、もはやPendingOrderTicket_ 1の正しい値を持っていないので、中断したところから拾うことができない。


こんにちは、Raptorさん、いつもありがとうございます。

上記のコードの問題はそれだけでしょうか?最悪の場合、PendingOrderTicket_1が修正されず、SLのまま閉じてしまうと思うのですが。

OrderSelect関 数の使い方は大丈夫でしょうか?

 if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1

この場合、OrderTicket_1 が最初の Gap_Level1 を超えても、この条件が満たされるたびに注文が変更されることになります。

そうなのでしょうか? もしそうなら、以下のコードで解決できるでしょうか?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void BuyOrderModifyLevel_1()
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
      {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             HasBeenExecuted = false;
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            {
            HasBeenExecuted = true;
            }
     }    
   
}


それとも、CheckGapLevel_1で、そこを一度だけチェックするようにすればいいのでしょうか?もしそうなら、下のコードは正しくできていますか? どこかに "break "を置くべきところがありますか?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            HasBeenExecuted = false;
            {
            HasBeenExecuted = true;                
            BuyOrderModifyLevel_1;
               
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

本当にありがとうございます;)

理由: