[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 774

 
drknn:

我不明白我在市场订单中开了一行,我把它复制并添加一个新的订单,但同样的4107错误不起作用,如果你愿意看看我错过了什么

附加的文件:
test_21_1.mq4  15 kb
 
FoxUA:

我不明白,我在市场订单开盘时有这一行,我把它复制到一个挂单中,并添加一个新的订单,但同样的4107错误仍然写到日志中,但挂单被放,如果你愿意看一下我错过了什么。


你的代码组织得太差了。而且变量名称有缩写,也让人看不明白。

代码应以区块形式组织。以这样的方式为变量赋名,让人一目了然地了解代码的内容。不变的名字(养成习惯)用大写字母书写。带值的常量初始化必须放在初始化块中。因此,例如,你有一个绝对不合理的字符串的使用

string sy = Symbol();

在EA的开始。那么,请告诉我,如果在整个交易过程中,符号名称保持不变,为什么在每一个刻度上都需要调用 Symbol()函数?在初始化块中用变量sy的值初始化一次就够了,仅此而已。此外,这个代码块

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

这从根本上说是错误的!要想知道最后一个订单的止损,必须先用OrderSelect()选择它(该订单)--见下面订单计数器中的例子。这意味着,如果你需要最后一个订单的止损位,你将需要通过一个循环来完成。下一步。的设计

int total = OrdersTotal();
if(total == 0){

}

是没有道理的。函数OrdersTotal()将返回终端中已经打开的订单总数。这个值包括由其他交易工具开出的订单,以及不是由专家顾问开出的,而是由您个人对同一工具手动开出的订单,而专家顾问已经下了这些订单。

如果你不打算用手交易,只交易EA抛出的符号,那么这种设计就可以了。但只要你想用手交易,而EA又不干扰你的手动交易,或者你希望交易也能用其他符号执行,这个设计就真的让你失望了。所以你最好为每种订单类型编写单独的订单计数器。下面是这样一个计数器的例子。

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  string SMB=Symbol();
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
      Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){continue;}// если не наш, то смотрим следующий
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  

考虑到上述建议,重写代码!!!

 

对不起,我没有意识到,像这样的字符串

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

调用一个子程序。

但还是要以不同的方式来组织它。

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

你不需要把一个交易符号的名称传到子程序中。你的子程序是在专家顾问中,而不是在包含的库中。由于变量sy是在Expert Advisor的全局层面上声明的,所以这个变量是在这类子程序的范围内。此外,你把第二个参数传给子程序,但当你调用子程序本身时,你用一个值初始化这个参数(int op=-1)--你不需要这样做。下一个参数的情况也是如此。

航线

>> 如果(op<0 || OrderType()==op) {

又是无法阅读。看看在我的柜台里是如何组织的!

 

然后是这个。代码块

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

在每次打勾时都会被调用。但并不是每次打勾都需要这样做。在某些情况下,你只需要知道止损/获利订单。这时你需要调用你的子程序。

 
spidey:

你好,请你在指标上附加一个警报(绿色的与红色的从上到下交叉 - 卖出,返回 - 买入)?

好吧,有人又在论坛上发布偷来的代码。:))))))))

我怀疑是否有人愿意免费挖掘这些杂乱无章的数字变量 :)

 
spidey:

下午好,请您为火鸡添加一个警报(绿色的从上到下穿过红色的--卖出,回来--买入)?

如果你再这样做,我将被迫把你驱逐出游戏。

这违反了论坛规则。

 
该代码是否应该被张贴?
 
drknn:

对不起,我没有意识到,像这样的字符串

调用一个子程序。

但还是要以不同的方式来组织它。

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

你不需要把一个交易符号的名称传到子程序中。你的子程序是在专家顾问中,而不是在包含的库中。由于变量sy是在Expert Advisor的全局层面上声明的,所以这个变量是在这类子程序的范围内。接下来,你向子程序传递第二个参数,但当你调用子程序本身时,你用一个值初始化这个参数(int op=-1)--你不需要这样做。下一个参数的情况也是如此。

航线

>> 如果(op<0 || OrderType()==op) {

又是无法阅读。看看它在我的柜台里是如何被组织的!

所以我猜想,函数调用 可以简单地写成

PrAskLim = StopLossLastPos(OP_SELL); 在函数本身中

double StopLossLastPos(int op=-1,) 像这样?

我已经说过,我从这个网站上取来的函数,它们的工作已经经过了测试,因为我不敢把它们的变量改成更可读的变量,因为我可能缺乏经验,不知道什么可以改,什么不能改;这充满了危险,我可能在一个工作的函数中改错了什么,你会在一堆代码中重新针锋相对。

但我尽可能地修复我自己添加的东西。

我自己已经添加了它,但它没有解决我的日志4107的问题,我不得不问我如何能改变价格和止损,因为我没有从根本上改变它的任何东西。

第二个问题是如何在这个价格上增加一个价差 PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )

以下是该EA的修改版本

附加的文件:
test_21_2.mq4  16 kb
 
spidey:
该代码是否应该被张贴?
你不需要张贴被盗的东西。
 
drknn:
你不需要发布偷来的东西。

你不一定要偷东西。

而这个资源的规则并没有禁止它......

https://www.mql5.com/ru/code/8089

;)

原因: