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

 
Alexey Belyakov:

こんにちは。

一問だけ悩んでいるのですが、解き方を教えていただけませんか?

考え方は以下の通りです。私は ローソクの前回の最大値に線を引きます。直前の最大値によってラインをずらしたい。

必要な時にティックのラインプライスを変更できないようにするのは誰ですか?

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   PRH;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи

  if (rs1 >= rt) // условие для построения уровней (если верхняя тень предыдущей свечи, больше, или равна телу этой же всечи, то...   
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
    Comment("ЦЕНА МАКС =======", PRH, "\n"); // комментарий пред. максимума
  }
}
//+------------------------------------------------------------------+
ファイル:
 
MT5が、ポジションを建てるときの最初の取引の価格と時間、そのポジションを閉じるときの最初の取引の価格と時間を履歴からどのように知ることができるか教えてください。目的は、手動で取引するときにエクイティすることがあるので、それが有効かどうかを把握するために、履歴からエントリーポイントの配列を取得することです。私は取引操作について 何も知らないので、これらの関数が実装されていないクラスを使っています :(
 
Aleksei Beliakov:
2つのオプションがあります。
1.オブジェクトを作成する前に削除する
2.オブジェクトを作成した後に価格を設定する

こんにちは、namesakeさん!)


void OnTick()
  {
//---
   double   o1 = iOpen(Symbol(),Period(),1);
   double   h1 = iHigh(Symbol(),Period(),1);
   double   l1 = iLow(Symbol(),Period(),1);
   double   c1 = iClose(Symbol(),Period(),1);
   double   c0 = iClose(Symbol(),Period(),0);
   double   rt = 0;
   double   rs1 = 0;
   double   rs2 = 0;
   
rt=MathAbs(c1-o1)/_Point; //размер тела свечи
rs1=MathAbs(h1-c1)/_Point;// размер верхней тени свечи
rs2=MathAbs(l1-c1)/_Point; // размер нижней тени свечи

ObjectDelete(0,"HL");

if ((rs1>=rt)&&(c1>o1)) //[для ростовых свечей] условие для построения уровней (если верхняя тень предыдущей свечи, больше, или равна телу этой же свечи, то...   
{
double PRH=iHigh(Symbol(),_Period,1); // то это будет максимум
ObjectCreate(0,"HL",OBJ_HLINE,0,_Period,PRH); // и строим по этому максимуму, горизонтальную линию
}

ObjectDelete(0,"lL");

if ((rs2>=rt)&&(c1<o1)) // [для падающих свечей]условие для построения уровней (если нижняя тень предыдущей свечи, больше, или равна телу этой же свечи, то...   
{
double PRL=iLow(Symbol(),_Period,1); // то это будет минимум
ObjectCreate(0,"lL",OBJ_HLINE,0,_Period,PRL); // и строим по этому минимум, горизонтальную линию
}
}

オプション1、近いものを検討。最初は計画通りに進んでいたのに、だんだん乱れてくる。

 
Mihail Matkovskij:

そして、必要なときにティック上のライン価格を変更するだけで、誰がそれを妨げるのでしょうか?


//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1>= rt)&&(c1>o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
   if ((rs2>= rt)&&(c1<o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    hLine.Price(0, PRL);  
  }
  
  
}
//+------------------------------------------------------------------+

まあ、そんな感じですね。ちょっとだけ条件を加えると、問題が発生します。必要なのは、「新しい高値・安値がなければ保存する」ということです。

 
Alexey Belyakov:


まあ、そんな感じですね。ちょっとだけ条件を加えると、問題が発生します。必要なのは、「新しい高値・安値がなければ保存する」ということです。

どうだろう、Low用のラインをもう一本追加するのを誰が止めるんだろう...?

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
  if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    lLine.Price(0, PRL);  
  }
}
//+------------------------------------------------------------------+

ラインなどのオブジェクトを一通り追加して、それですべてのLowとHighをマークすることができます。何が問題なのか......?

 
Aleksey Vyazmikin:
ポジションを建てるときの最初の取引の価格と時間、このポジションを閉じるときの最初の取引の価格と時間を履歴から取得する方法を教えてください。私の目的は、履歴からエントリーポイントの配列を取得することです。手動で取引する際にエクイティすることがあるので、それが有効であるかどうかを知りたいのです。私は取引操作について 何も知らないので、これらの関数が実装されていないクラスを使っています :(

HistorySelectByPositionを 使用すると、次のようなことができます。

そうすると、いくつかの選択肢があります。

  • 取引を行うには、DEAL_ENTRY_IN またはDEAL_ENTRY_OUT プロパティをチェックして、市場に参入または退出し、その取引の価格と時間を取得 します。
  • 注文を受ける。インデックス0ではマーケットへの参入、OrdersTotal()-1ではマーケットからの退出となります。
  • 一番いいのは、両方を取ることです。ポイントは、スリッページでポジションを建てた場合、取引価格≠注文価格となることです。従って、必要なものを必要なだけ持っていく。
Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 
mt5でバッファの束をコンパクトに宣言する方法はないのでしょうか?
 
Mihail Matkovskij:

どうだろう、Low用のラインをもう一本追加するのを誰が止めるんだろう...?

ラインなどのオブジェクトを一通り追加して、すべてのLowとHighをそれでマークすることができます。何が問題なのか......?

はい!ちゃんと動いていますよ。ミハイルさん、ありがとうございます。


というように、下ネタをピアスしてしまって、ピアス後に削除する必要がある場合。

if (c0<PRL)  
  {
  lLine.Delete(0,"lLine"); 
  }

そうだろ?

 
Alexey Belyakov:

そうです!当然のように動作します。ミハイルさん、ありがとうございます。


そして、最下段がパンチングされたときに削除しなければならない、みたいな場合。

そうだろ?

プログラムでは、レベルを強調するために2行しか使用しません。0にすればいいのに、なぜ削除してまた作るのか...?

lLine.Price(0, 0.0);

チャート上に線が表示されなくなる...。そして、それをまた見せることができる。

lLine.Price(0, PRL);
 
Mihail Matkovskij:

このプログラムでは、レベルを強調するために2本の線を使用するだけです。0にすればいいものを、なぜ削除して作り直すのか...?

チャート上に線が表示されなくなる...。そして、それをまた見せることができる。

こんな感じ?それともOnInitで何か別の宣言をする必要があるのでしょうか?

if (c0<PRL)  
{
lLine.Price(0,0.0);
}