MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1285

 
Valeriy Yastremskiy:

1日に1440件の注文がある場合、分足の開始時、もっと簡単に言えば分足のバーの出現時にチェックがあるはずです。そして、この時点でオープンに。あなたはそれを持っていないので、EAは、現在の引用符で私たちのシンボルの条件に従って、それ自体が厳格な条件である、すべてのティックでポジションを開く。この条件が満たされないと、ダニを見逃してしまうことがあります。そしてある時、重大なエラーが発生する。

また、注文執行の 種類(ポジションを作るための取引の実行命令) All or nothing.

了解しました。ありがとうございました。

また、私のEAでは、これだけ多くの注文を開くのは難しいと思いました。以下のコードで注文数を制限してみました。

MqlDateTime time_now;
TimeCurrent(time_now);
if(time_now.hour==10&&&&time_now.min==0)
{
//открыть ордер
}

つまり、10:00にだけ注文を開ける。しかし、結果は同じです。

2020.10.27 10:25:17.548 Core 1 使用メモリ 272 Mb、ヒストリーデータ 36 Mb、ティックデータ 64 Mb を含む


input int      StopLoss=30;      // Stop Loss
input int      TakeProfit=100;   // Take Profit
input double   Lot=0.1;          // Количество лотов для торговли
int A;    //

//+------------------------------------------------------------------+
void OnTick()
  {
//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;
  }

私は何を間違えているのだろう?

追加・変更したコードに色をつけました

ログファイルにはこのように書かれています。

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 接続を終了 しました。


 
Denis Diakonov:

アドバイスお願いします

新しいティックが入ったときにサーバーの時刻が更新されないのはなぜですか?

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ティックごとに印字し、新しい分単位で値を更新します。

int M = TimeMinute(TimeCurrent());
bool TimeServer()                                                  
{  
   Print(M, " - Tекущее время сервера");
   if((M > 55 || M == 55) && (M < 59 || M == 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}

さて、ここでコードの全容を紹介します。void OnTick()関数では、最初に実行される行でトリガーされます。

スケジュール/削除フィールド/に再コンパイルまたは追記された瞬間にのみトリガーされます。それ以外の時間は、変数MにはEAの初回実行時に得られた分の値が保持される。

 
Denis Diakonov:

まあ、ここに全コードがある、というだけなのですが。void OnTick()は、一番最初に実行される行でトリガーされます。

リコンパイルやグラフ/削除フィールド/への結合の瞬間にのみトリガーされます。それ以外の時間は、変数MにはEAの初回実行時に得られた分の値が保持される。

//--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick() // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute(TimeCurrent());
m2=M;
if(m1!=M)
   Alert (M, " - Tекущее время сервера");
   Print(M, " - Tекущее время сервера");
    if((M >= 55) && (M <= 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}
 
Valeriy Yastremskiy:

了解です、ありがとうございます

をすればよかった。

int M = TimeMinute(TimeCurrent());

の前に値Mを代入するのではなく、関数本体に 置く。

 
Denis Diakonov:

了解です、ありがとうございます

をすればよかった。

は、M値を関数の 前に代入するのではなく、関数の本文の中に入れてください。

いろいろなやり方があるんですね。グローバル変数、ローカル変数とその可視性を読み取る。

 

午後角度からトレンドラインの角度を求めようとする。以下はそのコードです。

void DrawLine(string name,
              datetime time1,
              double price1,
              datetime time2,
              double price2,
              double &angle)
  {
   CChartObjectTrendByAngle *line=new CChartObjectTrendByAngle();
   if(!line.Create(ChartID(),name,0,time1,price1,time2,price2))
     {
      Print(__FUNCTION__+": object line create failed. Last error: ",GetLastError());
      delete line;
      return;
     }
   
   line.Color(InpColorZoneUp);
   line.Background(false);
   line.RayLeft(false);
   line.RayRight(false);
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

の角度は常に0です。標準ライブラリの メソッドを使うか、組み込み関数を使うかは関係ない。同時に、線も引かれる。どうしたんですか?角度の出し方は?

 
leonerd:

午後角度からトレンドラインの角度を求めようとする。以下はそのコードです。

の角度は常に0です。標準ライブラリの メソッドを使うか、組み込み関数を使うかは関係ない。同時に、線も引かれる。どうしたんですか?角度の出し方は?

https://www.mql5.com/ru/forum/103591

なるほど、でも角度はどうやって計算するのですか?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd:

https://www.mql5.com/ru/forum/103591

なるほど、でも角度はどうやって計算するのですか?

お笑い芸人さんなんですね。

何言ってるんだろう?

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL4やMQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプやディスカッションなど何でもOK

ニコライ・セムコ さん 2020.10.26 00:34

スピードを恐れてはいけない。あくまで型変換のための条件付けです。
角度定義機能のバリエーションとして。

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 - количество минутных баров во временном промежутке отрезка. 
   static int 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("Время левой границы вне диапазона исторических данных");
      return DBL_MAX;
     }
   int bar1 = iBarShift(_Symbol,tf[i],p1.time);
   int bar2 = iBarShift(_Symbol,tf[i],p2.time);
   if(bar1==bar2)
      return 0.0;
   return atan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
  }

MT5以降、MT4の使用感がとにかくひどい。歴史へのアクセスは、どこかemasculatedなのです。ダニの話でもないんですけどね。




 

このフォントの選択はインジケータで可能かどうか教えてください。