新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 23

 
giannis1386:

我完全糊涂了。

double blevel=OrderStopLoss()<Bid-Point*TS; 对我有用SL只追求价格上的利润。

double slevel=OrderStopLoss()>Ask+Point*TS; 我不知道怎么把这个加到else中去

这不是一个bool。

不是bool,但它被称为隐式转换

你到底在做什么?拖网?

 
Artyom Trishkin:

不是bool,但它被称为隐式转换

你到底在做什么?拖网?

是的,我试着做了一个拖网。原来的脚本只是在订单达到利润时关闭。
 
giannis1386:
是的,试图做一个拖网。原来的脚本只是在订单的利润达到时关闭。
不是脚本,是EA。你混淆了项目的类型。脚本在加载到图表上后被执行一次,然后被删除。如果它不是循环的。不太可能有人做一个循环的脚本来平仓
 
giannis1386:
是的,我试图做一个拖网。

逻辑。

如果循环中选择的当前订单的利润大于设定值,如果其止损小于(买入)/大于(卖出)计算出的止损拖曳水平,则将止损转移到新值。

这是一个简明的说法。

 
Artyom Trishkin:
这不正是我所建议的吗?

是的,嗯...我很不专心地看了你的代码,不如说我根本就没看。但这是一半的麻烦,然后我说了这样的垃圾,我几乎感到羞愧。出于某种原因,我突然有了这个疯狂的想法,ArrayMaximum() 可能被应用于一个结构数组,甚至是这个数组的一个独立字段。

我忏悔了,我不建议其他人这么想,这不起作用...:)

 
Alexey Viktorov:

是的,嗯...我很不专心地看了你的代码,不如说我根本就没看。但这是一半的麻烦,然后我说了这样的垃圾,我几乎感到羞愧。出于某种原因,我突然有了这个疯狂的想法,ArrayMaximum()可以应用于一个结构数组,甚至是这个数组的一个独立字段。

我忏悔了,我不建议其他人这么想,这不起作用...:)

嗯...那我呢? 我以同样的方式看了你的代码,并感谢你--它真的很短......

简而言之--都值得一笑......。

 
Artyom Trishkin:
不是一个脚本,是一个专家顾问。你混淆了项目的类型。脚本在加载到图表上后被执行一次,然后被删除。如果它不是循环的。几乎没有人会做一个循环的脚本来关闭头寸

根据作者的说法。

下面是一个稍加修改的标准MT4 close.mq4脚本

将该文件放在MetaTrader/experts/Scripts文件夹中

 
Artyom Trishkin:

嗯...我呢? 就在我瞥见你的代码时,我鞠躬表示感谢--它真的很短......

简而言之--都值得一笑......。

不,我不同意。这个代码

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

经测试,可以使用。有简单的用户定义的双数组,而CopyRates()填充的是一个数组 结构,因此你不能通过使用处理数组的函数来选择最大和最小。

 
giannis1386:

根据作者的说法。

下面是一个稍加修改的标准MT4 close.mq4脚本

将该文件放在MetaTrader/experts/Scripts文件夹中

所以他的脚本只起一次作用--我把它放在图表上,脚本起作用(平仓),然后卸载。

你不需要脚本,你需要一个EA。

 
Alexey Viktorov:

不,我不同意。这个代码

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

经过测试,可以使用。这里是简单的自定义双数组,CopyRates()填充了一个结构数组,因此你不能用数组函数选择最大和最小。

好吧,我告诉你--我也在超级认真地观察你的代码。所以--这个笑话是关于我的。

SZY......但我的代码返回四个值:高/低/最高/最低,你的代码只返回高和低,而且我的代码检查数据复制是否成功(虽然不是全部),你的代码没有......

这就是我的代码如何检查所需数据的完整复制。

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)==rangeBars) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+