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

 

下午好,先生们。)))抱歉,我是业余的......。

我不明白OrderClose是如何工作的:(

我需要最多1个订单,也就是说,在开立新的订单之前,我希望前一个订单被关闭...

为什么不这样做呢?


OrderClose(nom, 0.01, Bid,5, Red)。

OrderSend(Symbol(), OP_SELL, 0.01 ,NormalizeDouble(Bid,5), 3 , NormalizeDouble(Ask+0.0005,5), NormalizeDouble(Bid-0.0008,5), " ", nom,0,Red)。


该日志基本上是关于一个无效的票据的宣誓。

在OrderClose中,而不是nom,我应该放什么?或者我的思考方向完全错误吗?)

 
Sergey Voytsekhovsky:

尝试minStopLoss=当前价格+/-(MaxValue(2*Spread, StopLoss))。

我试过了。两个价差是24,不会这样的,从收盘价的19开始工作。从目前的开盘价 来看,有三个价差。
我在循环中增加了一个点的止损,并开了一个订单。它于19日开幕。问题不在于如何设置。问题是如何正确计算。没有价格;如果你用止损按钮设置了止损,它们就会在手动开立订单时显示出来。这很荒谬,我正在检查整个论坛。我在第7页上找到了一些功能(信息#65)。我检查后会让你知道。

 
Sergey Voytsekhovsky:

我研究了一下,但没有什么新东西,显然它是(对我来说是新的),当然,对所有入门者来说是显而易见的,不言而喻。我找不到任何新的东西,除了上面描述的在索引过程中相互安排缓冲区的特点。这一连串的尊重,得到了更多的cheesier图片。

图片如下,文件附后

也许你很不走运,但我不喜欢在别人的代码中打探。当涉及到修复它时,更是如此...。

下一个问题:你认为多少次指标值会正好是50?

         ColorHistogram_2Buffer1[i]=50; 

按照我对问题的理解,应该是一种颜色>50,另一种颜色<50,但我没有看到==50。当然,为了消除==50情况下的损失,我们必须在宗教允许的情况下,将其中一个比较>=50或另一个<=50。它可能看起来更好。

第二个问题:你认为有多少次需要改变缓冲区的所有索引?重新索引后,你是否准确地修复了代码中的所有内容?也许让彩色缓冲区索引4,以及相应的辅助缓冲区 5和6会更容易。这样就不需要编辑,也不可能再犯一些错误。

 
klok79:
我试过了。两个价差是24,不会这样的,从收盘价的19开始工作。从目前的开盘价 看,它与三个价差一起工作。
我在循环中增加了一个点的止损,并打开了订单。19岁时,它打开了。这不是一个如何挑选的问题。问题是如何正确地计算它。如果我用按钮设置止损,手动开单时没有出现价格。这太荒谬了,我正在对这个论坛进行大规模的阅读。我在第7页上找到了一些功能(信息#65)。我将不得不检查并报告。

已检查。作品
这一切都很奇怪,它说的是同样的minStopLoss = Current Price +/- (MaxValue(2*Spread, StopLoss)),只是在Current Price下我们理解的不是订单的开仓价,而是镜像价格。
为什么双倍摊开是合适的?
又出现了两个问题。
1.为什么SymbolInfoInteger被用来获取Digits()和Point();值?
2.为什么在调用SymbolInfoInteger函数之前要使用一个条目(int)?根据我的理解,这是一种强制型的转换。

 
klok79:

检查过了。它的作用
这一切都很奇怪,他们仍然写着同样的minStopLoss = Current Price +/- (MaxValue(2*Spread, StopLeval)),但Current Price不是订单的开盘价,而是镜像价格。
为什么双倍摊开是合适的?
又出现了两个问题。
1.为什么SymbolInfoInteger被用来获取Digits()和Point();值?
2.为什么在调用SymbolInfoInteger函数之前要使用一个条目(int)?根据我的理解,这是一种强制型的转换。

要获得Point()SymbolInfoInteger将不会以任何方式工作。))

一般来说,有必要记住Point()或_Point只针对当前符号。对于EA工作的字符以外的字符,你必须使用这个非常函数。

SymbolInfoInteger函数 不仅返回int值,而且还返回long、bool和枚举值。

 

Sergey Voytsekhovsky,感谢您的帮助。还有一个问题,如果你不介意的话,请建议一下与函数CharToStr
(从符号中获取代码)相反的函数,因为我在Beisic和Delphi中已经有了相关的函数,但在C++中,据我所知,有两种方法。
1 -Ascii_cod 函数,它不在mql4中
2
.- 直接类型转换。但我的代码是
string st="A"。
打印("字符代码A=",(int)st)。

输出文本 字符编码A=0。

该怎么做?

 
klok79:

Sergey Voytsekhovsky,感谢您的帮助。还有一个问题,如果你不介意的话,能否建议CharToStr函数反向函数
(从一个符号中获取它的代码),因为我用的是Beisic和Delphi,它们有相关的函数,而在C++中,据我所知,有两种方法。
1 -Ascii_cod 函数,它不在mql4中
2
.- 直接类型转换。但我的代码是
string st="A"。
打印("字符代码A=",(int)st)。

输出文本 字符编码A=0。

该怎么做?

StringToCharArray 与wiki函数不同,它不是一次只转换一个字符,而是可以将一个字符串转换为一个 带有 字符串中所有字符代码 ucar类型的数组

mql4也有这样一个功能。

Документация по MQL5: Преобразование данных / StringToCharArray
Документация по MQL5: Преобразование данных / StringToCharArray
  • www.mql5.com
Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов. [in]  Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо...
 
Alexey Viktorov:

要获得Point()SymbolInfoInteger将不会以任何方式工作。))

一般来说,有必要记住Point()或_Point只针对当前符号。对于EA工作的字符以外的字符,你应该使用这个函数。

SymbolInfoInteger函数 不仅返回int值,而且还返回long、bool和枚举值。

实际上,点的价值是双倍的。这意味着,我们应该从SymbolInfoDouble 中调用它。

 
Konstantin Nikitin:

好吧,点实际上有一个双倍的值。这意味着请求应该由SymbolInfoDouble 提出。

这是关于65号 帖子中MQL4的这些函数。

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+

我没有看到Point是在哪里通过SymbolInfoInteger()获得的。

 
Artyom Trishkin:

这是关于帖子#65 中的那些MQL4函数。

我没有看到Point是在哪里通过SymbolInfoInteger()获得的。

是的,一样的。我们已经滑过了它。最主要的是,他明白什么是什么。