inputint StopLoss=30; // Stop Lossinputint TakeProfit=100; // Take Profitinputdouble Lot=0.1; // Количество лотов для торговлиint A; ////+------------------------------------------------------------------+voidOnTick()
{
//Print( "====================================================", TimeCurrent() ) ;//--- Объявляем структуры, которые будут использоваться для торговлиMqlTick latest_price; // Будет использоваться для текущих котировокMqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросовMqlTradeResult mresult; // Будет использоваться для получения результатов выполнения торговых запросовMqlDateTime time_now;// Будет использоваться дляTimeCurrent(time_now); if(!SymbolInfoTick(_Symbol,latest_price))
if(time_now.hour==10&&time_now.min==0)
{
mrequest.action = TRADE_ACTION_DEAL; // немедленное исполнение
mrequest.price = NormalizeDouble(latest_price.bid,_Digits); // последняя цена Bid
mrequest.sl = NormalizeDouble(latest_price.ask + StopLoss*_Point,_Digits); // Stop Loss
mrequest.tp = NormalizeDouble(latest_price.ask - TakeProfit*_Point,_Digits); // Take Profit
mrequest.symbol = _Symbol; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.type= ORDER_TYPE_SELL; // ордер на продажу
mrequest.type_filling = ORDER_FILLING_RETURN; // тип исполнения ордера - все или ничего
mrequest.deviation=100; // проскальзывание от текущей цены//--- отсылаем ордерOrderSend(mrequest,mresult);
}
return;
}
struct PointPriceTime
{
double price;
datetime time;
PointPriceTime(double p, datetime t) { price=p; time=t; };
void Set(double p, datetime t){ price=p; time=t;};
PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
PointPriceTime() { price=0.0; time=0; };
};
double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X
{ // расстояние между x1 и x2 = N*_Point, где N - количество минутных баров во временном промежутке отрезка. staticint tf[9]= {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
int i=0;
while(i<9 && SeriesInfoInteger(_Symbol,tf[i],SERIES_FIRSTDATE)>p1.time)
i++;
if(i==9)
{
Print("Время левой границы вне диапазона исторических данных");
returnDBL_MAX;
}
int bar1 = iBarShift(_Symbol,tf[i],p1.time);
int bar2 = iBarShift(_Symbol,tf[i],p2.time);
if(bar1==bar2)
return0.0;
returnatan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
}
1日に1440件の注文がある場合、分足の開始時、もっと簡単に言えば分足のバーの出現時にチェックがあるはずです。そして、この時点でオープンに。あなたはそれを持っていないので、EAは、現在の引用符で私たちのシンボルの条件に従って、それ自体が厳格な条件である、すべてのティックでポジションを開く。この条件が満たされないと、ダニを見逃してしまうことがあります。そしてある時、重大なエラーが発生する。
また、注文執行の 種類(ポジションを作るための取引の実行命令) All or nothing.
了解しました。ありがとうございました。
また、私のEAでは、これだけ多くの注文を開くのは難しいと思いました。以下のコードで注文数を制限してみました。
つまり、10:00にだけ注文を開ける。しかし、結果は同じです。
2020.10.27 10:25:17.548 Core 1 使用メモリ 272 Mb、ヒストリーデータ 36 Mb、ティックデータ 64 Mb を含む。
私は何を間違えているのだろう?
追加・変更したコードに色をつけました
ログファイルにはこのように書かれています。
FD 0 10:57:05.453 Core 1 127.0.0.1:3000 でエージェントプロセスを開始 しました。
CS 0 10:57:05.453 Core 1 127.0.0.1:3000 に接続 中。
JD 0 10:57:05.953 Core 1 接続 しました。
OD 0 10:57:05.975 Core 1 authorized (agent build 2650)
JL 0 10:57:05.980 Tester EURUSD,M1 (Alpari-MT5-Demo): expertsGRAAL.ex5 の testing from 2020.09.01 00:00 to 2020.09.10 00:00
ON 0 10:57:05.997 Core 1 共通の同期が完了しま した。
CJ 0 10:57:06.223 Tester 分析した履歴の品質は100% である。
LM 0 10:57:06.248 Core 1 MetaTester 5 は 127.0.0.1:3000 で起動 しました。
EJ 0 10:57:06.248 Core 1 初期化終了
LS 0 10:57:06.248 Core 1 login (build 2650)
KO 0 10:57:06.248 Core 1 4372バイトのアカウント情報がロードさ れました。
LI 0 10:57:06.248 Core 1 1482バイトのテスターパラメーターがロードさ れました。
FN 0 10:57:06.248 Core 1 1724バイトの入力パラメータをロード しました。
OK 0 10:57:06.248 Core 1 423 bytes of symbols list loaded (72 symbols)
HO 0 10:57:06.248 Core 1 expert ファイルを追加: ExpertsGRAAL.ex513680バイトをロード
CP 0 10:57:06.248 Core 1 4077 Mb使用可能、ティック生成用に50ブロック設定。
DI 0 10:57:06.248 Core 1 利益をpipsで計算、初期預金10000円、レバレッジ1:100
LP 0 10:57:06.248 Core 1 正常に初期化されました。
RI 0 10:57:06.248 Core 1 15 Kb の総初期化データを受信 しました。
DN 0 10:57:06.248 Core 1 Intel Core i5-6400 @ 2.70GHz、7883MB
IG 0 10:57:06.248 Core 1 EURUSD: 同期されるシンボル
RS 0 10:57:06.248 Core 1 EURUSD: シンボルが同期、3720バイトのシンボル情報を受信。
OL 0 10:57:06.248 Core 1 EURUSD: load 27 bytes of history data to synchronize in 0:00:00.003。
EK 0 10:57:06.248 Core 1 EURUSD: 2019.01.02 から 2020.10.23 まで履歴が同期さ れました。
LK 0 10:57:06.248 Core 1 EURUSD,M1: history cache allocated for 628432 bars and contains 619175 bars from 2019.01.02 06:00 to 2020.08.31 23:59
LH 0 10:57:06.248 Core 1 EURUSD,M1: 履歴は 2019.01.02 06:00 から開始 されます。
LN 0 10:57:06.248 Core 1 EURUSD,M1 (Alpari-MT5-Demo): OHLC bar states generating.バー開始時のみOnTick実行
JM 0 10:57:06.248 Core 1 EURUSD,M1: tests of expertsGRAAL.ex5 from 2020.09.01 00:00 to 2020.09.10 00:00 with inputs started:
LS 0 10:57:06.248 Core 1 StopLoss=30
PL 0 10:57:06.248 Core 1 TakeProfit=100
FJ 0 10:57:06.248 Core 1 Lot=0.1
DP 0 10:57:06.248 Core 1 最終残高 10000.00 pips
EE 0 10:57:06.248 Core 1 EURUSD,M1: 39553 ticks, 10068 bars generated.環境は0:00:00.031に同期されました。0:00:00.247 (前処理 0:00:00.016 を含む) でテストに合格しました。
DE 0 10:57:06.248 Core 1 EURUSD,M1: ログインからテスト停止までの合計時間 0:00:00.278 (履歴データ同期のための 0:00:00.031 を含む。)
NQ 0 10:57:06.248 Core 1 使用メモリ 272 Mb(ヒストリーデータ 36 Mb、ティックデータ 64 Mb を含む)。
KE 0 10:57:06.248 Core 1 log file "C:\Usersa1960﹑AppData﹑Roaming﹑MetaQuotes﹑Tester36A64B8C79A6163D85E6173B54096685 ◇Agent-127.0.1-3000 ◇logs ◇20201027.log written
OS 0 10:57:06.260 Core 1 接続を終了 しました。
アドバイスお願いします
新しいティックが入ったときにサーバーの時刻が更新されないのはなぜですか?
EAが起動した瞬間は全て正常に動作しているのですが、その後時間が経過しても現在の分の新しい値が変数に入ってきません。
つまり、変数int M = TimeMinute(TimeCurrent()) で得られる数値によってExpert Advisorが動作するのです。
実はこのコード行はリファレンスにあったもので、うまくいかないのです。
たとえば、12時に起動すると、 サーバーから返された現在の時刻は 変数内の時刻に対応しますが、その後、時計ではすでに15~20分経過しているにもかかわらず、変数は12時のままです
もっと正確に言うと、どこで関数を作り、どの関数(OnInit, OnTick, OnTime)で分数の値を取得してprint関数を呼び出すのか、完全に改善されたコードです。OnInitや端末の関数フィールドの外であれば、そのようになるはずです。OnTickの場合は、1ティックごとに印字し、新しい分単位で値を更新します。
Valeriy Yastremskiy:
コードは完全に良くなったというか、どこで関数を作って、どの関数(OnInit, OnTick, OnTime)で分の値を取得してprint関数を呼び出すかです。OnInitや端末の関数フィールドの外であれば、そのようになるはずです。OnTickの場合は、1ティックごとに印字し、新しい分単位で値を更新します。
さて、ここでコードの全容を紹介します。void OnTick()関数では、最初に実行される行でトリガーされます。
スケジュール/削除フィールド/に再コンパイルまたは追記された瞬間にのみトリガーされます。それ以外の時間は、変数MにはEAの初回実行時に得られた分の値が保持される。
まあ、ここに全コードがある、というだけなのですが。void OnTick()は、一番最初に実行される行でトリガーされます。
リコンパイルやグラフ/削除フィールド/への結合の瞬間にのみトリガーされます。それ以外の時間は、変数MにはEAの初回実行時に得られた分の値が保持される。
了解です、ありがとうございます
をすればよかった。
の前に値Mを代入するのではなく、関数本体に 置く。
了解です、ありがとうございます
をすればよかった。
は、M値を関数の 前に代入するのではなく、関数の本文の中に入れてください。
いろいろなやり方があるんですね。グローバル変数、ローカル変数とその可視性を読み取る。
午後角度からトレンドラインの角度を求めようとする。以下はそのコードです。
の角度は常に0です。標準ライブラリの メソッドを使うか、組み込み関数を使うかは関係ない。同時に、線も引かれる。どうしたんですか?角度の出し方は?
午後角度からトレンドラインの角度を求めようとする。以下はそのコードです。
の角度は常に0です。標準ライブラリの メソッドを使うか、組み込み関数を使うかは関係ない。同時に、線も引かれる。どうしたんですか?角度の出し方は?
https://www.mql5.com/ru/forum/103591
なるほど、でも角度はどうやって計算するのですか?
https://www.mql5.com/ru/forum/103591
なるほど、でも角度はどうやって計算するのですか?
お笑い芸人さんなんですね。
何言ってるんだろう?
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
MQL4やMQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプやディスカッションなど何でもOK
ニコライ・セムコ さん 2020.10.26 00:34
スピードを恐れてはいけない。あくまで型変換のための条件付けです。
角度定義機能のバリエーションとして。
MT5以降、MT4の使用感がとにかくひどい。歴史へのアクセスは、どこかemasculatedなのです。ダニの話でもないんですけどね。
このフォントの選択はインジケータで可能かどうか教えてください。