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

 
Alexey Belyakov:

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

いいえ、OnInitのすべての行は、デフォルトで非表示になって います。

int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij:

いいえ、OnInitではデフォルトですべての行が非表示になって います。

この条件はなぜか無視される。ポジションオープンを 設定しても

PRL変数は、ヤンクしてコンディションに入れることはできない。


if (c0<PRL)  
{
MqlTradeRequest request ={0};
MqlTradeResult  result= {0};
      request.action   =TRADE_ACTION_DEAL;                         // тип торговой операции
      request.symbol   =Symbol();                                 // символ
      request.volume   =1;                                       // объем в 1 лот
      request.type     =ORDER_TYPE_SELL;                         // тип ордера
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
      request.deviation=3;
      request.sl    = NormalizeDouble(Bid+50*_Point,_Digits);
      request.tp    = NormalizeDouble(Bid-50*_Point,_Digits);
      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

GlobalVariableGetで何とか引き出そうとしているのですが.でも、なんとなく怪しい...。

コンディションの中に入れても最低価格はすでに決まっています。しかし、それでも頑なにポジションを開くことを拒みます。


//+------------------------------------------------------------------+
//|                                                  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=0;
  double   PRL=0;
  double   Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double  Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

  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);
 
  
  
  // double a=GlobalVariableGet("i",PRL); 
Comment(" =======",PRL,"\n");

if (c0<PRL)  
{
MqlTradeRequest request={0};
MqlTradeResult  result={0};
      request.action   =TRADE_ACTION_DEAL;                         // тип торговой операции
      request.symbol   =Symbol();                                 // символ
      request.volume   =1;                                       // объем в 1 лот
      request.type     =ORDER_TYPE_SELL;                         // тип ордера
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
      request.deviation=3;
      request.sl    = NormalizeDouble(Bid+50*_Point,_Digits);
      request.tp    = NormalizeDouble(Bid-50*_Point,_Digits);
      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки;
}
}
}
//+------------------------------------------------------------------+
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Alexey Belyakov:

この条件はなぜか無視される。ポジションオープンを 設定しても

PRL変数をヤンクしてコンディションに入れることはできません。


PRL、オフセット1にLowがあります。
PRL = iLow(NULL, PERIOD_CURRENT, 1);
PRH, これはオフセット1のHighです。
PRH = iHigh(NULL, PERIOD_CURRENT, 1);

次のような画像が得られます。

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);  
  }
}

したがって、PRLの 代わりにiLow(NULL, PERIOD_CURRENT, 1)またはl1を取ることができます。

コードを書くことに興味がなく、何をやっているのか理解していない印象があります。少し我慢すれば、簡単に全てを把握することができます。コードをきれいにすれば、多くの疑問は自ずと解消されます。何が問題だったのかがわからない場合は、デバッグという方法もありますが、これはプログラマーの非常に強力なツールです。自分がやっていることを突き詰めて、そして質問する。

 
Alexey Belyakov:

この条件はなぜか無視される。ポジションオープンを 設定しても

可変PRLは、ヤンクしてコンディションに入れることはできません。


GlobalVariableGetで何とか引き出そうとしているのですが.でも、なんとなく怪しい...。

コンディションの中に入れても最低価格はすでに決まっています。やはりポジションを開きたくない。


では、なぜ最初に1つのメッセージを書いてから、それを編集しなければならないのでしょうか?

 
Alexey Belyakov:

この条件はなぜか無視される。ポジションオープンを 設定しても

可変PRLは、ヤンクしてコンディションに入れることはできません。


GlobalVariableGetで何とか引き出そうとしているのですが.でも、なんとなく怪しい...。

コンディションの中に入れても最低価格はすでに決まっています。やはりポジションを開きたくない。


マーケットエントリーのアルゴリズムもそうですが、コードのアルゴリズムがもともと間違っていたのですね。訂正させていただきました。

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

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


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

double   PRH = 0;
double   PRL = 0;

double entryPRL = 0;
double entryPRH = 0;

//+------------------------------------------------------------------+
//| 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   Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
  double  Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
  
  rt = MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1 = MathAbs(h1 - c1) / Point(); // размер верхней тени свечи
  rs2 = MathAbs(l1 - c1) / Point(); // размер нижней тени свечи
  
  if ((rs1 >= rt) && (c1 > o1)) { //условия для растущих свечей
    PRH = h1; // то это будет максимум
    hLine.Price(0, PRH);
  }
  
  if ((rs2 >= rt) && (c1 < o1)) { //условия для падающих свечей
    PRL = l1;
    lLine.Price(0, PRL);
    // double a=GlobalVariableGet("i",PRL);
    Comment(" =======", PRL, "\n");
  }
  
  if (PRL > 0 && c0 < PRL && PRL != entryPRL) {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};

     request.action   =TRADE_ACTION_DEAL;                     
     request.symbol   =Symbol();                          
     request.volume   =0.1;                                   
     request.type     =ORDER_TYPE_SELL;                       
     request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); 
     request.deviation= 5;                                    
     request.magic    = 0;                         

     if(OrderSend(request,result))
       entryPRL = PRL;
     else
       PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

  }
}
//+------------------------------------------------------------------+

でも、このコードを実際の取引で使えるようにするには、かなりの修正が必要になりそうです...。

 
Mihail Matkovskij:

先生のコードでは、もともとアルゴリズム自体が間違っていた上に、エントリーするアルゴリズムも間違っていたのです。修正しました。

しかし、このコードを実際の取引で使うには、多くの修正が必要です...。

とてもクールです。ありがとうございました。ここを同時に見ることで、多重入力の問題が解決されます。現在、正常に動作しています。
 

テスターで、修正中に4108(無効なチケット)が発生するのはなぜですか?MQL4

if(OrdersTotal() > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
     {
      if(OrderType() == OP_BUY && SymbolInfoDouble(_Symbol,SYMBOL_BID) >= value_tp1 && !_tps) _tps = OrderClose(ticket,c_lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),(int)slippage,clrNONE);
      if(OrderType() == OP_SELL && SymbolInfoDouble(_Symbol,SYMBOL_ASK) <= value_tp1 && !_tps) _tps = OrderClose(ticket,c_lot,SymbolInfoDouble(_Symbol,SYMBOL_ASK),(int)slippage,clrNONE);
      if(_tps && !sl_mod) sl_mod = OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,clrNONE);
     };


 
Alexandr Sokolov:

テスターで、修正中に4108(無効なチケット)が発生するのはなぜですか?MQL4


履歴に残っている注文を決済しようとしている可能性が高いです。

SELECT_BY_TICKETのヘルプを見ると、注文がすでに開かれているか、注文 履歴にあるかどうかに関係なく、この処理を行うようです。

SZZY:OrderCloseTime()のチェックを行う。

 
Igor Makanu:

すでに履歴に残っている注文を決済しようとしている可能性が高いです。

SELECT_BY_TICKETのヘルプをご覧ください。 これは、注文がすでに開かれているか、注文履歴 にあるかどうかに関係なく実行されます。

SZY:OrderCloseTime()をチェックする。

市場で選ぶと書いて あると思うのですが

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
OrderSelect - Trade Functions - MQL4 Reference
OrderSelect - Trade Functions - MQL4 Reference
  • docs.mql4.com
To find out from what list the order has been selected, its close time must be analyzed. If the order close time equals to 0, the order is open or pending and taken from the terminal open orders list. One can distinguish an opened order from a pending order by the order type. If the order close time does not equal to 0, the order is a closed...
 
Vitaly Muzichenko:

どれが発売されているか選べと いうことだと思います。

ドキュメントを引用する必要があるとは思わなかった......。

備考

チケット番号で注文を選択した場合、パラメータpoolは無視されます。チケット番号は、注文を一意に識別するためのものです。

どのリストから注文が選ばれたかを判断するには、その注文の終了時刻を分析する必要があります。注文終了時刻が0であれば、その注文は未決済または保留であり、端末の未決済注文リストから取得されます。