新人对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有低电平
PRL = iLow(NULL, PERIOD_CURRENT, 1);
公用事业,这是在偏移量1的高位
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);  
  }
}

因此,你可以 用iLow(NULL, PERIOD_CURRENT, 1)或l1代替PRL

我的印象是,你对写代码不感兴趣,不明白自己在做什么。只要有一点耐心,你就可以轻松地弄清楚这一切。清理你的代码,许多问题会自行消失。如果你不能弄清楚哪里出了问题,还有调试,它是程序员的一个非常强大的工具。弄清楚你在做什么,然后问问题。

 
Alexey Belyakov:

由于某些原因,该条件被忽略了。即使我设置了一个开仓

可变的PRL不能被扯掉,放在一个条件中。


我正试图用GlobalVariableGet将它拉出来。但不知为何,这很值得怀疑...

甚至当我把它放在条件里面的时候。最低价格已经确定。我仍然不想建仓。


那么,为什么我必须先写一条信息,然后再编辑它呢?

 
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:

我认为这说明选择哪一个人的市场

没想到我还得引用你的文件...

注意事项

如果使用票号选择订单,则选项池被忽略。票号是订单的唯一标识符。

为了确定一个订单是从哪个列表中选择的,我们应该分析其收盘时间。如果订单关闭的时间是0,那么该订单是开放的或待定的,并从终端的开放订单列表中提取。

原因: