Δtime=TimeCurrent()-time;//перестраховка на случай, если TimeCurrent() во время выполнения цикла изменитсяswitch(Δtime){
case0 ://если секунда не прошла
AccumulatorOfTicks(false);//заносим в массив-накопительbreak;
case1 ://если прошла ОДНА секунда после последнего тика
WriteBar();//по предыдущему тику рисуем свечу
AccumulatorOfTicks(true);//и ловим текущий тикbreak;
default://если прошло НЕСКОЛЬКО секунд после последнего тика
WriteBar();//по предыдущему тику рисуем свечу
Δtime--; time++;//уменьшаем разницу на единицу, т.к. свечу уже нарисовалиwhile(Δtime!=0) WriteDash();//и рисуем прочерки по кол-ву пропущ. сек. минус один
AccumulatorOfTicks(true);//ловим текущий тик
}
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.*/
}
}
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);//запоминаем позицию записи в файле
}
}
//-----------------------------------------------------------------------------+
//Kim Respect and respect !!!! |
//+----------------------------------------------------------------------------+
これは、コードの中で圧倒的にストレスの多い部分でした)))。
なるほど。何一つ理解できない。2つ目のTFを立ち上げた。すべてが規則正しく動いているはずです。でも、そうじゃないんです。いや、動いてはいるのですが、期待通りにはいきません。何度も確認した。私自身は、構文やアルゴリズムの間違いは見当たりません。説明します。 コード全体を添付します。だから
start()の冒頭に、前回のstart()から何秒経過したかのハンドラを置いています。繰り返される部分はユーザー定義関数に移動しました。新しい値time=TimeCurrent()は、ユーザー関数で、そこに割り当てられる。
この関数は,2つのモードで動作します.最初の分岐(AtFirst=true)では,ティックをキャッチして配列ストレージをプリゼロするだけですが,2番目の分岐(AtFirst=false)では,まさにティックストアとして動作します.つまり、ドライブをゼロにして切り捨て、ゼロのセルでビッドアスクを捕捉するか、ドライブを長くしてビッドアスクを捕捉するかである。アラートはデバッグのためにのみ設定されました。アキュムレータのゼロ化の状態については、この先で説明します。
ローソク足の「描画」機能(自律型チャートで開いた.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つで動作します。
この関数は、何秒後にティックがなかった場合にダッシュを "描く "ものです。以下のアルゴリズムに従って動作します。
Δ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に変換してみました。ローソク足が自律したチャートに表示されていません(しかし現在の気配値のラインはうまく動いています)。
スリッパを
こんにちは
ここで質問です。今日が月曜日だとしよう。金曜日の終値が 知りたいのですが。金曜日の終値が知りたいのですが。
Strategy Testerで土曜日と日曜日のバーが表示されているので質問させていただきました。この日は取引していません。書かれている線より上は、金曜日または日曜日の終値ですか?こんにちは
ここで質問です。今日が月曜日だとしよう。金曜日の終値が知りたいのですが。を書くことができますか?
ストラテジーテスターで、土曜日と日曜日にバーが表示されるので、この質問を受けました。その日は取引しませんでした。上に書かれている線は、金曜日または日曜日の終値ですか?金曜日の価格を教えてくださいもし、サーバーが金曜日の24時以降に終了し、日曜日の0時以降に開始されないとしたら!?
DailyPivotPointsインジケータを使用する!
なーんだ、全く理解できない。明らかにすでに書いている
アラートが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のエラーが出るのはなぜですか?
こんばんは。
質問に答えてくれてありがとうございました))
次のような買い注文を出す場合について教えてください。 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のエラーが出るのはなぜですか?
こんばんは。
質問に答えてくれてありがとうございました))
次のような買い注文を出す場合、教えてください。 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) を送信。
...売ってください。
注文を出す前に見積もりを更新することをお勧めします。
RefreshRates(); OrderSend (...);
また、スリップ率は3であり、4桁の相場では3ピップス、5桁の相場では0.3ピップスとして計算されます。ですから、もしあなたのEAが5桁の気配値で動作するのであれば、slipage = 30に設定してください。なーんだ、全く理解できない。明らかにすでに書いている
アラートが2になったところで、インジケータを分単位から外し、ローソク足の上にマウスをドラッグして...。Volume=1です。
FileInsight(デバッガみたいなもの)でhstのRateInfoを見てみると、多分intはあるけど、Volumeはdoubleじゃないと思う - いや、同じdoubleか・・・。
あなたのコードを見てみると...。混乱しすぎだよ))))
現在のバーのパラメータ(6つの数値TOHLCV)をメモリに保存し、ティック受信時に必要に応じて更新し、指定した条件(TimeCurrent()-O>1)でバーを切断すれば十分なので、ティックを蓄積する必要があるのか、よく理解できません。
この方法でコードを作り直すと、8倍になることを保証します(確認済み:)。