自行车运营商 "为 "问题 - 页 10

 
WhooDoo22:

我修复了你建议我完成的编码练习的 "无效票 "错误。我附上了一份专家顾问的副本供您个人查看。

这个练习的OrderClose()函数部分我相信已经完成。

这个练习的Print()函数部分我认为已经完成。

我认为剩下的就是第三部分,OrderModify()函数。

谢谢你。

你没有解决这个问题,你只是绕过了这个问题,这是典型的不了解问题的情况。 正如我已经说过的,解决原因而不是症状......

你仍然没有打印USDJPY的票号,请查看 原始需求。

你的MarketInfo()调用是错误的,即使它们确实起作用 ......

 

西蒙。

OrderModify()函数 的执行没有错误。

OrderPrint()函数的执行没有错误。

OrderClose()函数的执行没有错误。

请发表您的答复。

谢谢你。

附加的文件:
 
WhooDoo22:


请发表你的答复。


RaptorUK:

你没有解决这个问题,你只是绕过了这个问题,这是典型的不了解问题的情况。 正如我已经说过的,解决原因而不是症状。

你仍然没有打印USDJPY的票号,请查看原始需求。

你的MarketInfo()调用是错误的,即使它们确实起作用 . .

此外 . . .

如果你有和以前一样的情况,没有USDJPY订单,你将有失败的OrderStopLoss(), OrderTakeProfit(), OrderSelect()和OrderType()调用。

你对这行代码的期望是什么? 请在不查阅文档的情况下回答。

GetLastError();

在最后的代码块中,为什么要执行这行代码?. . .

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

只有当 . . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       

但你会一直执行这行代码,以及它后面的所有代码,不管TP和SL是什么?

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);} 

你的MarketInfo()调用仍然是错误的 ... ...看一下文档,找出原因。

 

西蒙。


你并没有解决这个问题,你只是绕过了这个问题......

你认为我还没有解决什么问题?


你仍然没有打印USDJPY的票号...

订购票号。



你的MarketInfo()调用是错误的,即使它们确实有效。

MetaEditor字典中的MarketInfo()函数示例。

样本。

// MarketInfo() function example;

   double bid   =MarketInfo("EURUSD",MODE_BID);
   double ask   =MarketInfo("EURUSD",MODE_ASK);
   double point =MarketInfo("EURUSD",MODE_POINT);
   int    digits=MarketInfo("EURUSD",MODE_DIGITS);
   int    spread=MarketInfo("EURUSD",MODE_SPREAD);

这里是我的OrderClose()函数代码块的样本。

// OrderClose() function code block example;

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

你认为我的OrderClose()函数代码样本格式有什么问题?它看起来与MetaEditor字典提供的'MarketInfo()'样本几乎完全一样。


此外......。


你对这行代码的期望是什么? 请回答,不要翻阅它的文档。

GetLastError();

GetLastError()函数在运行测试时向 "专家 "页面打印错误。如果该函数没有发现错误,就会打印出零(0)。请注意我在上面提供的快照中打印的0。


在最后的代码块中,为什么要执行这行代码 .. . .

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

只有当......。

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

但你会一直执行这行代码,以及它后面的所有代码,不管TP和SL是什么?

if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}


是的,我很高兴你提出了这个问题,因为我将解释我这样做的原因。

如果使用多行注释"/* - */"将所有其他代码块从程序执行中省略,并且在Start()和Return(0)函数中只剩下两个代码块。

   int i;
   double bid_ask,
          OM_Param_3,
          OM_Param_4;

// code block 1;   

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")
   
   i++;

// code block 2;

   if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   
     {
      Print(OrderTicket());     
      GetLastError();
     }

下面的代码块二是函数调用。

     {
      Print(OrderTicket());     
      GetLastError();
     }

Print()函数继续无限期地将数字打印到专家窗格中,并继续打印。我相信如果我加入

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

Print()函数将只执行一次,因为一旦下面的OrderModify()函数被执行,SL和TP将不再是零,将导致Print()函数停止。

现在我意识到,由于程序的执行方式,情况并非如此。我知道程序是从上到下执行的,所以当程序第一次完成其整个周期时,它将试图再次从上到下执行,并将无法将票据打印到 "专家 "窗格中,因为美元兑日元货币对上没有订单。


谢谢你。

 
WhooDoo22:

西蒙。


你并没有解决这个问题,你只是绕过了这个问题......

你认为我还没有解决什么问题?

由你编码while循环的方式引起的根本问题......导致OrderClose函数的无效票据OrderModify的未知票据2的 问题,你还没有解决这个问题,因为你已经解决了症状。

WhooDoo22:

你的MarketInfo()调用是错误的,即使它们确实有效。

MetaEditor字典中的MarketInfo()函数示例。


对不起,我的错误,你已经解决了这个问题 ...... 你知道我指的问题是什么吗?

WhooDoo22:

西蒙。

你对这行代码的期望是什么? 请回答,不要翻阅它的文档。

GetLastError()函数在运行测试时向 "专家 "页面打印一个错误。如果该函数没有发现错误,就会打印出零(0)。注意我在上面提供的快照中打印的0。


不,GetLastError()并不打印到日志中..它"该函数返回最后发生的错误,然后存储最后错误代码 的特殊last_error变量的值将被清零。因此,下一次调用GetLastError()将返回0。"

你图片中的0可能是来自..

Print(OrderCloseTime());

.是一个错误,因为订单不再被选择,因为它不再在订单池中,因为它现在已经被关闭,所以在历史池中。

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

. .. . . 添加这两行并试一下。

WhooDoo22:

Print()函数将数字无限期地打印到专家窗格中,并继续打印。我相信如果我加上....

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

Print()函数将只执行一次,因为一旦直接在这下面的OrderModify()函数被执行,SL和TP将不再是零,将导致Print()函数停止。

现在我意识到,由于程序的执行方式,情况并非如此。我知道程序是从上到下执行的,所以当程序第一次完成其整个周期时,它将试图再次从上到下执行,并将无法将票据打印到 "专家 "窗格中,因为美元兑日元货币对上没有订单。

我想你没有理解我的意思 ......如果我加上一些大括号,也许会更清楚。......你这样做了......。

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      }

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

......你是想这样做吗?

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      )
 
WhooDoo22:

西蒙。

你仍然没有打印USDJPY的票号......


要求是...... "以 "USDJPY的票号=""的形式将票号打印到日志上。

 

西蒙。


由你编码while循环的方式引起的根本问题......导致OrderClose函数的无效票据和OrderModify的未知票据2的问题,你还没有解决这个原因,你已经解决了症状。

我希望与你讨论这个问题本身的细微之处,使我能够集中思想解决这个问题,而不至于分心于其他的问题。


对不起,我的错误,你已经解决了这个问题......你知道我指的是什么问题吗?

是的,谢谢你提出来!


"该函数返回最后发生的错误,然后存储最后错误代码的特殊last_error变量的值将被清零。因此,下次调用GetLastError()将返回0。"

MetaEditor字典中写道。

intGetLastError() )
该函数返回最后发生的错误,然后存储最后错误代码的特殊last_error 变量的值将被清零。因此,下次调用GetLastError()将返回0。

该函数返回最后发生的错误,然后存储最后错误代码的特殊最后错误变量的值将被清零...

绿色表示理解黄色表示不理解


. ..添加这两行并试一下。

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

会做的。


我想你没明白我的意思 . . . 如果我加一些大括号也许会更清楚 .......你这样做了......。

我相信我是想这样做的......

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      }

这是因为我希望这个条件......

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

应用于大括号内的代码部分("{ }")。


要求是...... "以 "USDJPY的票号=""的形式将票号打印到日志上。

可以这样做。


谢谢你。

 
WhooDoo22:


"该函数返回最后发生的错误,然后存储最后错误代码的特殊last_error变量的值将被清零。因此,下次调用GetLastError()将返回0。"

MetaEditor字典中的内容是:。

intGetLastError() )
该函数返回最后发生的错误,然后存储最后错误代码的特殊last_error 变量的值将被清零。所以,下次调用GetLastError()将返回0。

该函数返回最后发生的错误,然后存储最后错误代码的特殊最后错误变量的值将被清零...

绿色表示理解黄色表示不理解

好的,你可以从文档中看到GetLastError()没有打印任何东西 . . . 它只是返回 错误号码 ....所以要使用它,你需要对它做一些事情 ....

Print("The last error was error number: ", GetLastError());

//  or . . .

int ErrorNumber = GetLastError();

//  or . . .

if(GetLastError() == 130)

当你调用GetLast Error()时,它返回错误,然后将内部用来保存最后一个错误的变量清除为零 ... ...所以如果你这样做 ... ...

OrderDelete(-1);   //  should produce an error 4108 or 3

Print("Last error was number ", GetLastError());    //  should print - Last error was number 4108

Print("Last error was number ", GetLastError());    //  should print - Last error was number 0  the previous call cleared the GetlastError internal variable
 

第二次调用GetLastError()将返回0,因为第一次调用将保存错误号的变量清零 ......还要记住,只保存最近的错误。

 
WhooDoo22:


我想你没明白我的意思 ......如果我加上一些大括号,也许会更清楚。......你这样做了......。

我相信我的意思是这样做的......。

这是因为我希望这个条件......

适用于大括号内的代码部分("{ }")。

但你没有......你在设计时错过了它,然后在编码时错过了它,然后在你阅读代码并检查 它是否能达到你的目的时错过了它,然后在你测试时错过了它。......大括号是那些你必须了如指掌的基本东西之一。

你需要了解你为什么会漏掉这个问题,并解决这个问题 ...... 没有人可以为你做这些,除非你想付钱让他们为你编码。

 

西蒙。


你图像中的0可能是来自......。.

Print(OrderCloseTime());


Nah-uh-uh!;)

让我们沿着文档通道来一次旅行吧?哈哈哈。

datetimeOrderCloseTime() )
返回当前选择的订单的关闭时间。如果订单关闭时间不为0,那么所选的订单已经关闭,并从账户历史中检索。未结订单和挂单的关闭时间等于0。

注意:订单必须是先前由OrderSelect() 函数选择的。


首先,让我们都来看看我最近编写的OrderClose()函数代码块...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
     }

接下来,让我们都来看看 "专家 "窗格的快照中显示的结果......

'专家'窗格的结果。

啊,我们有什么呢?)


请发表对新附的专家顾问的回应。它是否符合您的练习所包括的所有标准?


由你的while循环编码方式引起的根本问题......导致OrderClose函数的无效票和OrderModify的未知票2的问题,你还没有解决这个原因,你已经解决了症状。

我希望与你讨论这个问题本身的细微之处,使我能够集中思想解决这个问题,而不至于分散其他点的注意力。


谢谢你。

附加的文件: