[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 299

 
palomnik:

//-----------------------------------------------------------------------------+
//Kim Respect and respect !!!! |
//+----------------------------------------------------------------------------+

これは、コードの中で圧倒的にストレスの多い部分でした)))。

なるほど。何一つ理解できない。2つ目のTFを立ち上げた。すべてが規則正しく動いているはずです。でも、そうじゃないんです。いや、動いてはいるのですが、期待通りにはいきません。何度も確認した。私自身は、構文やアルゴリズムの間違いは見当たりません。説明します。 コード全体を添付します。だから

Δtime=TimeCurrent()-time;//перестраховка на случай, если TimeCurrent() во время выполнения цикла изменится
switch(Δtime){
  case 0 ://если секунда не прошла
    AccumulatorOfTicks(false);//заносим в массив-накопитель
    break;
  case 1 ://если прошла ОДНА секунда после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    AccumulatorOfTicks(true);//и ловим текущий тик
    break;
  default://если прошло НЕСКОЛЬКО секунд после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    Δtime--; time++;//уменьшаем разницу на единицу, т.к. свечу уже нарисовали
    while(Δtime!=0) WriteDash();//и рисуем прочерки по кол-ву пропущ. сек. минус один
    AccumulatorOfTicks(true);//ловим текущий тик
}

start()の冒頭に、前回のstart()から何秒経過したかのハンドラを置いています。繰り返される部分はユーザー定義関数に移動しました。新しい値time=TimeCurrent()は、ユーザー関数で、そこに割り当てられる。

void AccumulatorOfTicks(bool AtFirst){
        if (AtFirst){
                ArrayResize(bid, 1);//урезаем использованные массивы
                ArrayResize(ask, 1);
                i=0;//обнуляем счётчик тиков в секунду
                time=TimeCurrent();//приводим счётчик времени к текущему
        }else{
                ArrayResize(bid, i+1);
                ArrayResize(ask, i+1);
                i++;
        }
        bid[i]=MarketInfo(symbol, MODE_BID);
        ask[i]=MarketInfo(symbol, MODE_ASK);
        if (bid[i]==ask[i]) Alert("from accumulator: bid=ask");
}

この関数は,2つのモードで動作します.最初の分岐(AtFirst=true)では,ティックをキャッチして配列ストレージをプリゼロするだけですが,2番目の分岐(AtFirst=false)では,まさにティックストアとして動作します.つまり、ドライブをゼロにして切り捨て、ゼロのセルでビッドアスクを捕捉するか、ドライブを長くしてビッドアスクを捕捉するかである。アラートはデバッグのためにのみ設定されました。アキュムレータのゼロ化の状態については、この先で説明します。

void WriteBar(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //проверяем, переместилось-не переместилось, это я убрал, т.к. к вопросу не относится.
        }else{
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  ArraySize(ask), DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
                if(ArraySize(ask)==2) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - volume = ", ArraySize(ask)));
                if(bid[0]==ask[ArraySize(ask)-1]) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - bid=ask, Ticks = ", ArraySize(ask)));
                /*Необходимое пояснение. Хотя код рассчитан в т.ч. на тени свечей (т.е. независимыми от Open и Close
                 High и Low), в реальности их на чарте не будет, т.к. в секунде максимум 2 тика, три тика в секунде
                я ещё не встречал. Поэтому в массиве из двух элементов (т.е. двух тиков)
                один будет максимумом, другой минимумом, - и невольно совпадать с Open и Close.*/
        }
}

ローソク足の「描画」機能(自律型チャートで開いた.hstにローソク足を追加する機能)。同様に - デバッグのためにアラートを入れています。最初の警告は、1秒間に2つのティックをキャッチしたときにシグナルを出し(配列のサイズは2であり、考え方としてはボリュームは2に等しいはずです)、2番目の警告はキャッチしたティックのackに等しいビット(driveの同様の警告:しかしこれらは何らかの理由で非同期に動作します)、およびローソクのボリュームでシグナルを出しています。これは理論上のことで、実際には、例えば2(または0x00 00 00 00 00 40, double 2.0)とファイルに入力しても、なぜか1(0x00 00 00 00 00 F0 3F, BigEndian formatで double 1.0)になってしまうのです。私は通常、ドライブでその警告を上書きし、それは頻繁にビープ音、私はこの2つで動作します。

void WriteDash(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //аналогично убрал, т.к. к вопросу не относится.
        }else{//ставим прочерк на Close[0]
                Δtime--; time++;
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  0, DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
        }
}

この関数は、何秒後にティックがなかった場合にダッシュを "描く "ものです。以下のアルゴリズムに従って動作します。

Δtime=0: ticksをキャッチ(コピー) します。

Δtime=1:前にキャッチしたティックにローソク足を描き、そのティックをキャッチする(アキュムレータをあらかじめゼロにした状態)。

Δtime>1:前にキャッチしたティックにローソク足を引き、Close[0]線にΔtime- 1の分だけダッシュを引き、ティックをキャッチ(アキュムレータをあらかじめゼロにした 状態)する。どのような場合でも、アキュムレータにキャンドルがすでに描かれていて、アキュムレータがそれ以上必要ないことを意味するときは、アキュムレータをゼロにする必要があります。 これは、Δtime> 0のときに 起こる。

実行してみましょう。

矢印は、ビッドとアスクが等しく、ボリュームが1になるはずの瞬間を描いたものである。ボリュームで底を写さなかった、どうせ何も見えない、浅いんだから。しかし、それらはすべてレベル、すなわち0か1のどちらかで、2まで上がるものはありません(警告は出ていますが)。毎秒2ティック - それでもマウスを置くと皮肉にもボリューム= 1を示し、入札はaskuに等しく、また皮肉にもボリューム= 0を示しています。なぜ?どこかでエラーになっているのはわかるのですが、そのエラーに気づかないか、見る場所を間違えていることがほとんどです。コードを添付しますが、私の部分はしっかりコメントアウトし、あらゆるところでインデントをチェックし、インクルードを削除し、使用する関数だけを選択して、コンパイルが速くなるようにしました。ただ一点、オリジナルのtick collectorとは異なり、オフライン、つまりTimeLocalでは動作しません。なぜなら、私はそこに最初からif(tickTimeLocal==true)を書き込んだからです(あまり必要なかったので)。Tarasさんのアドバイスに従ってExpert Advisorに変換してみました。ローソク足が自律したチャートに表示されていません(しかし現在の気配値のラインはうまく動いています)。

ファイル:
fif.ta.mq4  18 kb
 
artmedia70:

スリッパを

運営からネタバレしてもらえよ。コメントされていない履物は、なぜか履物が少なくならないことに気がつき始めました))
 

こんにちは

ここで質問です。今日が月曜日だとしよう。金曜日の終値が 知りたいのですが。金曜日の終値が知りたいのですが。

iClose(NULL, Period_D1, 1)
Strategy Testerで土曜日と日曜日のバーが表示されているので質問させていただきました。この日は取引していません。書かれている線より上は、金曜日または日曜日の終値ですか?
 
gince:

こんにちは

ここで質問です。今日が月曜日だとしよう。金曜日の終値が知りたいのですが。を書くことができますか?

ストラテジーテスターで、土曜日と日曜日にバーが表示されるので、この質問を受けました。その日は取引しませんでした。上に書かれている線は、金曜日または日曜日の終値ですか?

金曜日の価格を教えてくださいもし、サーバーが金曜日の24時以降に終了し、日曜日の0時以降に開始されないとしたら!?

DailyPivotPointsインジケータを使用する!

 

なーんだ、全く理解できない。明らかにすでに書いている

                switch(ArraySize(ask)){
                 case 0: FileWriteDouble(hand1e,  0.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 0")); break;
                 case 1: FileWriteDouble(hand1e,  1.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 1")); break;
                 case 2: FileWriteDouble(hand1e,  2.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 2")); break;
                 default: Alert("!!!!! - ", ArraySize(ask));
                }

アラートが2になったところで、インジケータを分単位から外し、ローソク足の上にマウスをドラッグして...。Volume=1です。

FileInsight(デバッガみたいなもの)でhstのRateInfoを見てみると、多分intはあるけど、Volumeはdoubleじゃないと思う - いや、同じdoubleか・・・。

 

こんばんは。

質問に対する回答ありがとうございました))

次のような買い注文を 出す場合について教えてください。 OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

売り注文の場合OrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red) を送信。


は青色なのか、それとも赤色も変更する必要があるのか。

ここで、OP_SELLは売呼値

また、注文が変更されていないか確認したかったのですが、変更したくなかったので、Strategy TesterとDemoではすべてうまくいったのに、REAL Marketで開こうとすると129のエラーが出るのはなぜですか?

 
ed3sss:

こんばんは。

質問に答えてくれてありがとうございました))

次のような買い注文を出す場合について教えてください。 OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

売り注文の場合OrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red) を送信します。

は青色なのか、それとも赤色も変更する必要があるのか。

ここで、OP_SELLは売呼値

また、注文が変更されていないか確認したかったのですが、変更したくなかったので、Strategy TesterとDemoではすべてうまくいったのに、REAL Marketで開こうとすると129のエラーが出るのはなぜですか?

AscでBuy、BidでSellを開けば!そして、その逆を閉じる!
 
ed3sss:

こんばんは。

質問に答えてくれてありがとうございました))

次のような買い注文を出す場合、教えてください。 OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

売り注文の場合OrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red) を送信。

...
オンバイ。
OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0,"Покупка",0,0,Green);

売ってください。

OrderSend (Symbol(),OP_SELL,Lot,Bid,3,0,0,"Продажа",0,0,Red);

注文を出す前に見積もりを更新することをお勧めします。

RefreshRates();
OrderSend (...);
また、スリップ率は3であり、4桁の相場では3ピップス、5桁の相場では0.3ピップスとして計算されます。ですから、もしあなたのEAが5桁の気配値で動作するのであれば、slipage = 30に設定してください。
 
gyfto:

なーんだ、全く理解できない。明らかにすでに書いている

アラートが2になったところで、インジケータを分単位から外し、ローソク足の上にマウスをドラッグして...。Volume=1です。

FileInsight(デバッガみたいなもの)でhstのRateInfoを見てみると、多分intはあるけど、Volumeはdoubleじゃないと思う - いや、同じdoubleか・・・。

あなたのコードを見てみると...。混乱しすぎだよ))))

現在のバーのパラメータ(6つの数値TOHLCV)をメモリに保存し、ティック受信時に必要に応じて更新し、指定した条件(TimeCurrent()-O>1)でバーを切断すれば十分なので、ティックを蓄積する必要があるのか、よく理解できません。

この方法でコードを作り直すと、8倍になることを保証します(確認済み:)。

 
あるインジケーターを確認しようと、チャートに数字を入れたのですが、変わりません、別の言い方をしてみますと、添付のインジケーターでジグザグやアラートやプリントに立つクロスとして価格を固定したいのですが、接続時にフリーズしてしまいます。
ファイル: