オープントレードのチェックに問題がある

 

こんにちは、私はすでにオープントレードがあるかどうかをチェック するために、これを私のコードに追加しました。問題は、このコードは1つの取引を実行し、それだけです。どなたかこのコードに問題があると思われる方はいらっしゃいますか?私はプログラミングの超エキスパートではありません。


// 未決済取引のチェック

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol())
{
tradeopen=true;
}
else
{
tradeopen=false;
} }.

}

}

 
あなたのコードでは、保留と未決済の取引がピックアップされますが、それ以外は問題ないようです。
 

Raptorさん、早速のご返信ありがとうございます。


もしよろしければ、コード全体を添付させていただきます。私は今、この件で壁にぶつかっています。

ファイル:
daz.mq4  3 kb
 
dazamate:
どなたかこのコードに問題があると思われる方はいらっしゃいませんか?

  1. マジックナンバーがないということは、他のすべてのEAやマニュアル取引、同じペア/異なる時間枠の自分自身と互換性がないことを意味します。
  2. もし最初のオープンオーダーがEAのものでなければ、たとえオープントレードがあったとしても、フラグは偽となる。
    int TotalOrderCount(){
        int count=0;
        for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if (
            OrderSelect(pos, SELECT_BY_POS)                 // Only my orders w/
        &&  OrderMagicNumber()  == magic.number             // my magic number
        &&  OrderSymbol()       == Symbol() ){              // and my pair.
            count++;
        }
        return(count);
    }

 
dazamate:

Raptorさん、早速のご返信ありがとうございます。


もしよろしければ、コード全体を添付させていただきます。私は今、これで壁にぶつかっています。

いくつかのコメント......

あなたはiを 宣言する.

int i;

.しかし、あなたはそれを設定しないどこでも、 iは 何ですか?

あなたは... ...を設定します。

static bool tradeopen = false;

... その後、取引を行うことができるかどうかを確認 するためにそれをチェック します ... それは、この時点で常に偽になります ... その後、あなたはそれを真に設定することができるコードを後で持っている

if(OrderSymbol()==Symbol())
    {
    tradeopen=true;
    }  

barcountは0に設定されています。

static int barcount = 0;

チャート上に少なくとも1つのバーがある場合、これは常に真になります。

if(Bars != barcount)

あなたはコードを一行ずつ見ていく必要があります ... 理解できないことは調べて読んでください ... それがあなたが学ぶことができる唯一の方法です。

 

Raptorさん、ありがとうございます。私はスーパーエキスパートではありません。私は他の人たちがどのようにコーディングしているかを読み、それを私のものに実装しようとしました。私は関数についてたくさん読みました。ただ、うまくいかず、自分自身の災害を診断する方法を知らないときは、イライラします。

あなたのコメントに対して

int i;

それはありません、私は何か他のもののためにそれを使用していた誤ってそこにそれを残した。


私はバーカウンターに関して、私の頭の中で何が起こっているかを説明します。なぜコードのこの部分がダメなのか、まだよくわかりません。

static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if(Bars != barcount) // <-  This will be true so the if statement is allowed to run
    
       {      
         if(iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount=Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

ペアに未決済の取引があるかどうかのチェックについては...

static bool tradeopen = false;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)         {           if(OrderSelect(cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if(OrderSymbol()==Symbol()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

EAの最後に、現在のペアで未決済の取引があるかどうかを確認するために、次のようなチェックを行います。tradeopenをtrueかfalseのどちらかに設定します。このビットオフコードがEAの最後で使用されることは問題でしょうか?

また、もう一つの問題は、私は理解できません...

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);
iBarHourはなぜいつも1を返すのですか?現在の時間を返して欲しいんだけど :(


WHRoeder


EAがマジックナンバーを使うかどうかが問題なのでしょうか?EAがマジックナンバーを使うかどうかは問題ではないのでしょうか?



ありがとうございます。

 
dazamate:

バーカウンターに関して、私の頭の中で何が起こっているのかを説明します。私はまだコードのこの部分がなぜダメなのかよくわかりません。

申し訳ありませんが、私はおそらく静的変数の使用に関する私の無知を示している.. .私は代わりにグローバル変数を使用し、コードの初期化で設定したいものは、init関数に入れます。https://docs.mql4.com/basis/functions/special。

この部分は、サーバーの時刻を使用しており、時刻が更新されるたびに変更されます。

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);

このコードが動作すると仮定すると、dDayOpenPriceはiBarHour = 6の間だけ設定され、iBarHour = 7になるとdDayOpenPriceは正しい値には設定されなくなります。 dDayOpenPrice をグローバルにすると、その値はコードの実行中に保存されます(静的にしておくとうまくいくかもしれません)。 コードを再起動すると、翌日まで何も起こりません ... ... 午前 6 時のバーまで起こりません。

WHRoeder

EAがマジックナンバーを使うかどうかは重要でしょうか。すべての未決済取引と保留中の取引をチェックし、そのうちのどれかが現在のペアであるかどうかをチェックするだけではだめなのでしょうか?

もし、1つのEAを1つのチャートにのみ表示し、マニュアル取引は行わないのであれば、マジックナンバーを使わなくても大丈夫だと思います。

 

RaptorUK 改めてありがとうございます。


コードが機能しているかどうかを確認するためにEAをバックテストし、コードのデバッグを助けるために何が起こっているかを見るために変数をPrint()するのです。ibarhourのコードは正常に動作しているようですが、バックテストで正常に表示されませんでした。これは、ibarhourの値を常に表示するように設定したためで、コードがそれを吐き出すので、バックテスターは詰まってしまいます。プリントコードに遅延をかける方法はないでしょうか?



また、私はそれが06:00バーのオープンの値を格納するためにしたいです:)


私はコードを整理し直し、eaが現在のペアでどんな取引も開いたかどうかをチェックできるようにしたことを誇りに思います。私は WHRoederの 例を使って、それを別の関数にしました :) そして、その関数がtrueかfalseを返すようにしました。やったー。



あなたは明らかにEAコーディングの分野ではエリートですから。EAを自作している人たちから、どれくらいの成功談を聞いたことがありますか?私は悪い話しか聞いたり見たりしたことがありません。











 
dazamate:

あなたは明らかにEAコーディングの分野ではエリートですから。EAを自作している人から成功談をいくつ聞いたことがありますか?私は悪い話しか聞いたり見たりしたことがありません。











笑)。彼は私よりもずっと熟練したコーダーです。彼の最近の投稿を読んで、彼のコードを理解することで、多くのことを 学ぶことができます。).

私は、人々が自分自身を助けるのを助けようとするのが好きなので、ここにたむろしています... ...そして、その過程で何かを学ぶことができます。

EAを成功させるためには、まず成功する手法が必要です。 たとえ良い方法があったとしても(適切なテストなしにどうやってそれを知ることができるのか私にはわかりませんが)、一般的にはそれを実行可能なEAに変える知識や能力はありません。 実行可能なEAを持っている人は、その事実をほとんど宣伝しないでしょう、彼らはそれを使ってお金を稼ぐでしょう.

あなたが前進していると聞いてうれしいです ... プリントの問題については、Comment(iBarHour); を使う ことができます。

 
  1. どういたしまして "何かを学ぶには練習を。それを習得するために、教える。"
  2. Volume[0]==1 は信頼性が低く、1ティックを逃すとコードが壊れます。常に時間を使ってください。
    int start(){
       static datetime Time0;
       if (Time0 == Time[0]) return; Time0 = Time[0];
       // A new bar has started.

  3. おそらく、静的変数の使用に関する私の無知を示すものであろう.. .私は代わりにグローバル変数を使用して、私はコードの初期化で設定したいものは何でも
    変数が初期化される必要がある
    場合
    、それはグローバルでなければなりません。もし、その変数が2つ以上の関数で共有されるのであれば、グローバル変数でなければなりません。それ以外の場合は、その関数にローカルに定義し、必要であればスタティックにします。
  4. EAがマジックナンバーを使うかどうかは重要ですか?
    おそらく、すべてがうまくいって、次に別のチャートを開いてそこでテストすると、突然すべてが失敗します。最初からちゃんとやりましょう。私のコードでは、念のためマジックナンバーとペアの両方をチェックしていますが、マジックナンバーは変えません。
 

ラプターの言うとおりです。すみません、WHRoederさん、失礼しました。これは私にとって大きなプロジェクトの始まりなので、私があなたを悩ませることを本当に気にしないでください。


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder, このコードはとてもシンプルに見えますが、私の頭の中ではどう動いているのか理解できません。もし、time0がtime[0]と等しくなるたびにif文は常に真になりませんか?このような仕組みが理解できないのです。


もう2つ質問です。

保留中の注文が 配置され、それがXのバー量の間にトリガーされない場合、それはキャンセルされるようにカウンターを作るためにどのように行くのですか?私が思いつくのは、新しいバーが形成されるたびにカウントするカウンターを置き、カウントされたバーの量=保留中の注文がキャンセルされる前に指定された許容バーである場合です。バーカウンターは、新しい保留中の注文が開かれるたびにリセットされるのですか?どうですか?

次の質問。

これはどうしたらいいのか見当もつかない。

1時間足でユーロドル、ユーロドル、ポンドドル、ポンドポンドをスキャンする関数を作りたいのですが、どうすればいいですか?それは最後の06:00 gmtのローソク足まで戻ってオープンを記録し、さらに24バー前の06:00 gmtのローソク足まで戻ってオープンを記録し、各ペアの6gmt -6gmtレンジを記録します。そして、すべてのペアの6gmt - 6gmtレンジを比較し、最も高いものを返します。1つのタイムチャートに張り付いているEAでそのようなことは可能でしょうか?


皆さんの知識と患者さんに感謝します。

理由: