初学者的问题 MQL4 MT4 MetaTrader 4 - 页 19

 
Vitalie Postolache:
不要像这样))))
原因不是mql4
 
Vitalie Postolache:

这不是它的工作方式。这个函数的参数是:1)要搜索的字符串;2)要找到的字符组合;3)搜索的起点(默认情况下,根据第1点从字符串的空字符开始)。

它返回所寻找的子串在字符串中开始的位置数,如果没有找到子串,则返回-1。

因此,应该这样写。

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}

谢谢你的回答...因此,StringFind 函数及其参数( string_value, string match_substring, int start_pos=0 )在普通代码中被写成一行, 内容是

与函数参数数据相对应的参数: string OrderComment(), string "[tp]", int 0 ,如果这个表达式( 大括号 括起来)大于-1 ,则执行以下 {括号内}代码

如果(StringFind(OrderComment(),"[tp]",0)>-1)

{

double OrderTakeProfit()。

如果(OrderSelect(12, SELECT_BY_POS)==true)

Print("Order #",OrderTicket()," profit: " , OrderTakeProfit())。

否则

Print("OrderSelect()返回错误",GetLastError())。

bool PlaySound(

string payment // 其中"payment "MT4 Sound文件夹中的文件名

);

}

...这段代码能在MQL4中工作吗? ...

 
bablusut:

谢谢你的答复...事实证明,StringFind 函数及其参数( string_value, string match_substring, int start_pos=0 )在普通代码中只用一行就写好了 ,即

与函数参数数据相对应的参数: string OrderComment(), string "[tp]", int 0 ,如果这个表达式( 大括号 括起来)大于-1 ,则执行以下 {括号内}代码

如果(StringFind(OrderComment(),"[tp]",0)>-1)

{

double OrderTakeProfit()。

如果(OrderSelect(12, SELECT_BY_POS)==true)

Print("Order #",OrderTicket()," profit: " , OrderTakeProfit())。

否则

Print("OrderSelect()返回错误",GetLastError())。

bool PlaySound(

string payment // 其中"payment "MT4 Sound文件夹中的文件名

);

}

...这段代码能在MQL4中工作吗? ...

double OrderTakeProfit(); - 该代码在编译时应该有一个错误。

就我的理解(我自己还在研究),OrderTakeProfit();要求从市场上获得订单利润因此,我们的专家顾问对这几行提出了2个请求OrderTakeProfit(); 看起来这一行应该被删除 (double OrderTakeProfit(); )

 
bablusut:

谢谢你的答复...事实证明,StringFind 函数及其参数( string_value, string match_substring, int start_pos=0 )在普通代码中只用一行就写好了 ,即

与函数参数数据相对应的参数: string OrderComment(), string "[tp]", int 0 ,如果这个表达式( 大括号 括起来)大于-1 ,则执行以下 {括号内}代码

如果(StringFind(OrderComment(),"[tp]",0)>-1)

{

double OrderTakeProfit()。

如果(OrderSelect(12, SELECT_BY_POS)==true)

Print("Order #",OrderTicket()," profit: " , OrderTakeProfit())。

否则

Print("OrderSelect()返回错误",GetLastError())。

bool PlaySound(

string payment // 其中"payment "MT4 Sound文件夹中的文件名

);

}

...这段代码能在MQL4中工作吗? ...

这一点已经提到:双倍OrderTakeProfit()- 不要这样做。这个函数是自动声明的,不得重新宣布。 编译器将产生一个错误,因为标准函数不需要预先宣布。

if(OrderSelect(12, SELECT_BY_POS)==true)- 如果我们这样做,那么,充其量,这将是另一个订单,而不是上面已经处理过的评论的订单。在if(StringFind(OrderComment(),"[tp]",0)>-1) 之前,订单必须已经在最开始被选中,循环计数器必须作为订单号的参数,而不是一个常数,否则每次迭代都会检查第12个订单

 
Vitalie Postolache:

他们已经说过了:双倍OrderTakeProfit()- 不要那样做。这个函数是自动声明的,不能重复声明。 编译器会产生一个错误,因为标准函数不需要事先声明。

if(OrderSelect(12, SELECT_BY_POS)==true)- 如果我们这样做,那么,充其量,这将是另一个订单,而不是上面已经处理过的评论的订单。订单必须在最开始就已经被选中,在if(StringFind(OrderComment(),"[tp]",0)>-1) 之前

A1exPit

double OrderTakeProfit(); - 编译时应该在这里崩溃。

根据我的理解(我自己也是这样理解的),OrderTakeProfit();向市场提出订单的盈利要求因此,我们的专家顾问对这几行提出了2个请求OrderTakeProfit(); 看起来这一行应该被删除 (double OrderTakeProfit(); )

谢谢你的评论--事实证明你是对的。
 
"Vitalie Postolache:

他们已经说过了:双倍OrderTakeProfit()- 你不应该这么做。这个函数是自动声明的,不能重复声明。 编译器会产生一个错误,因为标准函数不需要事先声明。

if(OrderSelect(12, SELECT_BY_POS)==true)- 如果我们这样做,那么,充其量,这将是另一个订单,而不是上面已经处理过的评论的订单。顺序必须在一开始就被选中,在if(StringFind(OrderComment(),"[tp]",0)>-1) 之前,我们应该将循环计数器设置为顺序号的参数,而不是一个常数,否则我们每次迭代都会看到第12个顺序

谢谢你的答复...函数double OrderTakeProfit() 的声明是可以理解的,让我们删除它。

"如果我们在前面的代码中只有一个循环计数器,在OrdersHistoryTotal函数中,(i=0;i<accTotal;i++) 为主体的循环运算符必须被用作订单号的参数 这意味着我们应该用OrderSelect 函数的主体 来替换运算符的主体 我们将得到

如果(StringFind(OrderComment(),"[tp]",0)>-1)

{

如果(OrderSelect(i=0;i<accTotal;i++)==true)

Print("Order #",OrderTicket()," profit: " , OrderTakeProfit())。

否则

Print("OrderSelect()返回错误",GetLastError())。

bool PlaySound(

string payment // 其中"payment "MT4 Sound文件夹中的文件名

);

}

...这段代码能在MQL4中工作吗? ...




 
bablusut:

谢谢你的答复...函数double OrderTakeProfit() 的声明很清楚,让我们删除它。

"循环计数器应作为订单号的参数"--在前面的代码中,我们只有一个循环计数器,即OrdersHistoryTotal函数中的 循环操作符 其主体为(i=0;i<accTotal;i++), 这意味着我们应该用OrderSelect 函数的主体 替换操作符的主体 就可以得到。

再一次。在与订单有关的工作中,第一位 的必须是OrderSelect。然后是其他一切。

如果我们围绕订单进行循环工作,操作顺序如下

1.检查 if(OrderSelect())

2.检查它是否是正确的订单,我们通常检查符号和魔法号码,然后检查类型if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) - 在这种情况下,只有为当前符号和指定魔法号码的市场订单被处理

其他数据的处理,如OrderComment()、OrderProfit()等。

它看起来会是这样的

for(int i=OrdersHistoryTotal()-1; i>=0; i--) //перебираем историю торгов
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //если ордер выбран то работаем дальше, иначе смысла нет
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) //Если ордер тот, что нам нужен (эту проверку можно и опустить, если нужно обработать все ордера в истории)
         {
            if(StringFind(OrderComment(),"[tp]",0)>-1) //если найден признак закрытия профитом
            Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
            if(StringFind(OrderComment(),"[sl]",0)>-1) //если найден признак закрытия стоплосс
            Print("Order #",OrderTicket()," loss: "OrderTakeProfit());
         }
      }
}
 
如何检查iCustom指标的 一个或另一个缓冲区中是否有信号值?
 
Vitalie Postolache:
再一次。在处理一个订单时,OrderSelect应该放在首位 。然后是其他一切。

他们显然是通过试验和错误来决定的,但这很昂贵,我自己也经历过......

说实话,我的耳朵在嗡嗡作响......

 
atik441:
如何检查iCustom指标 缓冲区中是否有信号值?
按照链接,它在你的帖子中被强调。