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

 
Funky:

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

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

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

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

3. 3. そうなのでしょうか? もしそうなら、以下のコードで修正されますか?

再びありがとうございます;)

1. あなたのコードを壊すことになる何かが目に飛び込んできただけです。


2. 2. OrderSelect が間違っています (https://docs.mql4.com/trading/OrderSelect) チケット番号を使って選択するのであれば、SELECT_BY_ POS ではなくSELECT_BY_TICKET を使用しなければなりません。

3. 私はそうは思いません。あなたがしたことは、その関数が一度だけ呼ばれることを意味すると思います... ...修正が必要な次の注文がある場合はどうなりますか? 同時に2つの注文を開いている場合はどうなりますか?

私は、あなたがやっていることを100%理解しているわけではありませんし、あなたのコードを詳しく見る時間もありません ... ... しかし、私は質問があります。

注文の OrderOpenPrice(), OrderStopLoss(), OrderTakeProfit() を見て、それがすでに レベル1、2、3に変更されているかどうかを判断できないのでしょうか?

 
RaptorUK:

1. あなたのコードを壊してしまうようなことが目に飛び込んできた。


2. 2. OrderSelect が間違っています (https://docs.mql4.com/trading/OrderSelect) もしチケット番号を使って選択するのであれば、SELECT_BY_ POS ではなくSELECT_BY_TICKET を使用しなければなりません。

3. 私はそうは思いません。あなたがしたことは、その関数が一度だけ呼ばれることを意味すると思います... ...修正が必要な次の注文がある場合はどうなりますか? 同時に2つの注文を開いている場合はどうなりますか?

私は、あなたがやっていることを100%理解しているわけではありませんし、あなたのコードを詳しく見る時間もありません ... ... しかし、私は質問があります。

注文のOrderOpenPrice(), OrderStopLoss(), OrderTakeProfit() を見て、それがすでに レベル1、2、3に変更されているかどうかを判断することはできないのでしょうか?

Raptorさん、ありがとうございます。あなたの洞察力がとても役に立ちました。

私も時間的な制約があることをよく理解しており、あなたの時間とヒントにはとても感謝しています。私は誰かに書いてもらおうとしたわけではないので、あまり詳しくは書きませんでした...そのため、あまり詳細がわからないとヘルプを提供しにくいという問題があります。 この例では、私が学習中に心配していたのはむしろコードであり、あなたのヒントは私にとって素晴らしいものでした。

1.テストするためにバシバシ組み立てているので、電源断の問題は後でもっと経験を積んだら直すかもしれません。

2.POSではなく、SELECT_BY_TICKETに変更します、どうもありがとうございました。

3. GAP_Level1 は一度だけ呼び出されるようにしたいので、おそらく私のつなぎ方はそこで正しいのでしょう...。 質問の答えですが、私は最新の未決済注文のTicketを見て、それが私のTradeUpマークを超えるかどうかを確認しようとしています。 そのとき、以前の注文をすべて上にドラッグしてほしいのです(今回はマジックナンバーで選択し、すべてを取得します)...。この段階で、私は別の保留中の注文を持っていて、それがGap_Level2になったら、同じコードでBuyModify_Level2ブロックを持つことになる......。 どうなんだろう?

ロジックがうまく書けてるといいのですが、今回、ご指摘の通り、本当に紙に向かってナットクしました...(笑)。

 
Funky:


3. GAP_Level1 は一度だけ呼び出されるようにしたいので、おそらく私のつなぎ方は正しいのでしょうが...。 質問の答えですが、私は最新の未決済注文のチケットを見て、それが私のトレードアップマークを超えるかどうかを確認しようとしています。 そのとき、以前の注文をすべて上にドラッグしてほしいのです(今回はマジックナンバーで選択し、すべてを取得します)...。この段階で、私は別の保留中の注文を持っていて、それがGap_Level2になったら、同じコードでBuyModify_Level2ブロックを持つことになる......。 どうでしょう?


どのように(あるいはコードのどこで)HasBeenExecuted = falseを 設定するのでしょうか; そうすれば IfGap_Level_1() は2番目の取引のセットに対して実行されるのでしょうか?
 
RaptorUK:
どのように(あるいはコードのどこで)HasBeenExecuted = falseを 設定するのでしょうか;そうすれば IfGap_Level1() は2番目の取引のセットに対して実行されるのでしょうか?

いい質問ですね。

私は、エクスポートする変数の下にある内部変数の先頭にその変数をブールするつもりでした。 GAP_Level_1, GAP_Level_2, GAP_Level_3, GAP_Level_4, GAP_Level_5 などとするつもりでした。 GAP_Level_1になったら、この最初のギャップレベルは忘れることができるわけです。

あなたの指摘は私に考えさせるもので、とても感謝しています。 今問題が見えてきました。

取引がSLに到達して、もう一度やり直すとき、最初の取引で再びGap_Level_1を探し、回転させたいことに気づきました。 そして、PendingOrder_1とGAP_Level_1、PendingOrderLevel_2とGAP_Level2を結びつけるつもりだったので、これは問題を引き起こすことになりますね。

まだ引っ張れそうですが、これは言われなければ思いつきませんでした......。

回避策は3つ考えられるのですが・・・。 1つ目は私の脳力ではちょっと無理です(笑)。

1. IF LAST TRADE IS LOSSとした場合、すべてのPENDING ORDERを DELETEし、トレードがSLにヒットしたらそれらを再開させる。 つまり、Pending Order 1 が Gap Level_1 に到達すると、次に GAP_Level5 に到達する Pending_Order5 が停止されます。 SLがヒットした後、私のオープントレードはすべて同じSLを共有しているのでクローズされます。

2.もう一つの選択肢は、最初の取引が行われた後にNEWTRADEというブール変数を挿入し、IFNEWTRADE==1というブロックを作り、GAP_Level1へ行くというものです(数週間前の私の別のコードの問題であなたのヒントに感謝します)。 これは、私がIFNEWTRADE1保留中の順序1ブロックで、IFNEWTRADE2保留中の順序2ブロックで、などなど...それからIFNEWTRADE2==1 GAP_Level2に行くことができると思います考えさせられました。

EDIT (after a coffee): 3.ふと思ったのですが、注文を時間でソートして(複数の注文をいろんな方法でソートできることは知っています)、時間に基づいて ORD_SELECT_NUMBER というインタージャー変数を代入したらどうでしょうか? そして、ORD_SELECT_NUMBER == 1の後、GAP_Level1に行き、そのORDER_SELECT_NUMBER ++コマンドを使って次のORD_SELECT_NUMBERを見ます。

私はシグナルなどに基づいて単一注文のEAを書くのは大丈夫なのですが、この複数注文のものだけは正直言って死にます...。 私のEAはそのまま動いていて、良い結果を出しているのですが、EVERYTICKで変更するため、ただクレイジーな使い方をしています。

でも、Raptorさん、ありがとうございました。

 
Funky:

コーディングの知識だけでなく、優れた論理性も重要なんですね。

C++、Perl、Pascal、Fortran、Assemblerなど、どんな言語でコーディングされたものであっても、すべてのソフトウェアは問題を解決するためにあるのです。 もし解決策の背後にある論理に欠陥があるのなら、あなたがどれだけ優れたコーダーであろうと関係ない。
 
RaptorUK:
C++、Perl、Pascal、Fortran、Assemblerなど、どんな言語でコーディングされているかに関わらず、すべてのソフトウェアは問題を解決するためにあるのです。もしあなたの解決策の背後にある論理に欠陥があるならば、あなたがどれだけ優れたコーダーであるかは問題ではありません...解決策が先で、コードは後なのです。

おっしゃることはよくわかるのですが...。設計図のない建築家は、たとえ世界一の建築家であっても、遠くへ行くことはできません。最初のプランの方が重要 なのです。

Raptorさんには大変お世話になりました。

私は上記の怠惰なオプション1にしました。

この恐竜が完成した後、私はどのように行ったかを報告するために、それはプログラミングの時間と時間であった、私のEAは約85k(したがって、唯一の断片を掲載)、まだしている。この恐竜が完成してどうなったかはまだ報告できない。私が書きなれているシングルオーダーのEAとはかけ離れているので、勉強しながらやっています。このプロジェクトで深海に飛び込み、泳ぎ方を学んでいるところです。どうなるかまた投稿します。

Raptorさん、ありがとうございました。)

 
Funky:

おっしゃることはよくわかるのですが...。設計図のない建築家は、たとえ世界一の建築家であっても、遠くへ行くことはできません。最初のプランの方が重要なのです。

Raptorさんには大変お世話になりました。

私は上記の怠惰なオプション1にしました。

この恐竜が完成した後、私はどのように行ったかを報告するために、それはプログラミングの時間と時間であった、私のEAは約85k(したがって、唯一の断片を掲載)、まだしている。この恐竜が完成してどうなったかはまだ報告できない。私が書きなれているシングルオーダーのEAとはかけ離れているので、勉強しながらやっています。このプロジェクトで深海に飛び込み、泳ぎ方を学んでいるところです。どうなるかまた投稿します。

Raptorに感謝します。)

コードリソースの拡張が進み、将来的にEAで使用するために共通化できる関数が あれば、library/includeなどの利用を検討してみてください。

ティラノサウルスに成長すると、自分のコードがジュライシックパークで行方不明になることがあります。

 
diostar:

コードリソースの拡張が進み、将来的に共通化できる機能が出てきたら、ライブラリやインクルードなどの利用を検討してください。

ティラノサウルスに成長すると、自分のコードがジュライシックパークで行方不明になってしまいます。



ははは、笑っちゃいました。確かに、そういうことはありますね。

正直なところ、私は「OrderSendReliable.mqh」というライブラリインサートを見つけました。私はまずこのEAを完成させるつもりで、それからそのライブラリ・インサートの使い方を、他のEAcodeの記事と一緒に投稿するつもりでした。

私は、経験上、EAのトップにいろいろな種類の#includeがあるのがわかるので、苦笑してしまいました、ハハ。

あなたのコメントを見て いると、ついカチンときてしまいます。私はちょうど私が好きな{セクション}を取得したときに私のEA間でコードをカットアンドペーストして、それらを結びつける(例:その{セクション}は、他のもので困っていた。例えば、以前紹介した他の投稿で悩んでいた{section}など)。それをLibrary Insertにして、参照するだけというのは思いつきませんでしたが...。そういうのはまだまだ先の話です...。このEAの後、最初のライブラリインクルードをあれで始めて様子を見ようと思っていたところでした...可能性はとてもクールです。このMQLはかなり病みつきになりそうです。

そうそう、私のコードもすべて順調で、その目的には完璧に機能しています。)..

私は本当にあなた方のサポートに感謝しています、言葉でどれほどのものか説明できればと思います;)

 

コア "ライブラリ関数の 独自のセットを持つことができます、私は強く、後より早く検討することをお勧めします。

私も最初のEAは、同じようにコピー、ペースト、コピーペースト・・・でした。

転機となったのは、すでに引退していた元軍人のためにこのEAを作ったときでした。その時、初めてライブラリーを使い始めたんです。

そのライブラリは今でも大切に保管しています。もしこれがあなたにアイデアを提供し、あなたを助けることができるのなら・・・ここにそのヘッダーがあります。

#define PI              3.1415629
#define GOLDEN_RATIO    1.618

#import "command.ex4"
   bool     isInit();
   bool     isFractional(string ins);
   bool     isOrderLimit(int cap);
   bool     isRiskLimit(double risk);
   
   int      ioSession(int h);
   string   ioWkday(datetime d);
   double   ioOrderPriceLvl(string ins, int type, double oPrice);    
   double   ioPriceLvl(string ins,double dPrice);
   bool     ioTrailStop(string ins, int tkt, int type, double oPrice,int lvl, double stop=0);
   int      ioTotalOrd(int magic);
         
   int      opClose(string ins,int ticket,int cmd,double lLot,bool Activate.NO_BREAK_ONE=false);
   int      opOpen(string ins, int cmd, double lLot, double lPrice, double lLoss, double lProfit, string comment,int EA.Id, int lSlip=0, bool Activate.NO_BREAK_ONE=false);
   int      opModify(string ins, int ticket,int cmd,double lPrice,double lLoss,double lProfit,bool Activate.NO_BREAK_ONE=false);   
   double   opStopLvl(string ins,double p);
   double   opNorm(string ins,double price);
   double   opNormL(string ins,double d);   
   double   opPoint(string ins);
   
   double   intelLot(string market, double risk,double stop); 
   double   intelCorrel(string s1,string s2, int f, int type);   
   int      intelPriceMove(string ins, int p, int L);
   int      intelTrend(string ins, int p, int q);   
#import

これが役に立つといいのですが......。

 
diostar:

あなた自身の「コア」ライブラリ関数のセットを持つことができます、私は強く、後より早く検討することをお勧めします。

私も最初のEAから始めて、同じようにコピー、ペースト、コピーペースト...。

転機となったのは、昔、軍にいた元軍人のためにこのEAを作った時でした。 その時、初めてライブラリーを使いました。

そのライブラリは今日まで保管しています。 もしそれがあなたにアイデアを提供し、あなたを助けることができるのなら...ここにそのヘッダーがあります、仲間です。

参考になれば幸いです。


Hi Diostar、それは本当にクールな仲間です。情報を共有してくれてありがとう。 変数を持ち歩くのに最適な方法だと思いますし、後で定義することもできます。 ちょっと考えてみます。 私はこのようなヒントが好きなんだ、ありがとう。 ギターを習うのと同じで、20年後に「最初からこうしておけば、この20年間は楽だったのに」と思うことがあるんだ(笑)。 もっと調べてみようと思います。

あぁ、燃えてきたと思ったら、今度は解決できないドラマが待っている。 この2つの結合部分の正しい順序を選択するのに苦労しているのです。

例題を2つ出して、その効果を見せようと思うのですが、私の脳はこの例題をクリックすることができません...。

例1.

SCROLLSは、私が望むように正確に前の順序を介して、しかし、それはEVERYTICKにそれらを変更します。

(Raptorが助けてくれたorder selectのオリジナルのドラマはLevelsの衝突を止めたので、以前もその理由でSLがドタバタしてました。 私はこの最後の部分を整理するのは簡単だと感じましたが、何日もそれに取り組んでいて、それがすべてのカチカチ音が するのを止めようとしているように感じます...)

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)))
            {
                IfGap_SELLLevel_00AlreadyExe = false;
            }
            if (IfGap_SELLLevel_00AlreadyExe == false)
            {
                IfGap_SELLLevel_00AlreadyExe = true;
                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) 
        { 
            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);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


例2:

この例は、私が望むものではありません...私はこのオプションを試して、それがすべてのティックで送信を修正するのを止めました... しかし、それは注文をスクロールせず、ちょうどすべてのティックで正しいチケットのいずれかを変更します(それは注文のインデックスキャッシュの最後の最初の順序を変更すると思います)。

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()
{
    bool IfGap_SELLLevel_00AlreadyExe = FALSE;
    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;
            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()));
        }
    }
    
}


私は、前に実行されていない場合、IFGAPにそれを渡すために最初に少しIF EXECUTED 00セクションを試して、別の50の試みがあります...しかし、私は前にスイッチを挿入する多くの運を持っていなかった......。 そのオプションを示すために、この例を投稿するかもしれません......。

例3:

スイッチを入れても、例1と同じ効果があります。 オーダーが正しくスクロールされますが、チックするたびに変更されます....

私はスイッチが再びfalseを発行し続けるのを見ることができるので、ただ再び通過します... しかし、他の試みはそれを全く通過させないでしょう... 私はこのオプションに固執し、IfGap_SELLLevel_00AlreadyExe = trueを他の場所で宣言してみてください、もしそうなら、どこで?

void IfGap_SELLLevel_00AlreadyBlock()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES))
    {
        IfGap_SELLLevel_00AlreadyExe = false;
    }
    if (IfGap_SELLLevel_00AlreadyExe == false)
    {
        IfGap_SELLLevel_00AlreadyExe = true;
        IfGap_SELLLevel_00();  
    }
}


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) 
        { 
            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 ret = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


そうそう、また皆さんに迷惑をかける前に、本当に試したんですよ...何時間も何時間も...。 また迷子になってしまいました...。

もしそうなら、どこでそうするのでしょうか?)