任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 155

 

如果其中一个挂单触发,那么我就在相反的方向上下另一个挂单,并将成交量增加一倍,例如,如果我下买入,那么我就在比买入低25点的地方下卖出止损,如果我下卖出,那么我就在高25点的地方下买入止损。如果其中一个挂单被触发,我们在第一个未平仓订单的价格上再下一个与被触发订单相对的挂单,如果它也被触发,我们在25点内再次下一个与被触发订单相对的挂单,等等。因此,所有的买单应该是一个价格,而所有的卖单也应该是一个价格。如果有人理解我在这里写的东西,请帮忙写代码))

int A = 0;
if (OrdersTotal()==0)
   {
   A = 0;
   if ( Close[2] < Close[1])
      {
      OrderSend (Symbol(),OP_BUY,1,Ask,3,Ask-50*Point,Ask+25*Point,0,1);                 // первый вариант событий
      OrderSend (Symbol(),OP_SELLSTOP,2,Bid-25*Point,3,Bid+25*Point,Bid-50*Point,0,2);
      A=1;
      }
      
   if ( Close[2] > Close[1])
      {
      OrderSend (Symbol(),OP_SELL,1,Bid,3,Bid+50*Point,Bid-25*Point,0,1);               //второй вариант событий
      OrderSend (Symbol(),OP_BUYSTOP,2,Ask+25*Point,3,Ask-25*Point,Ask+50*Point,0,2);
      A=2;
      }
   }
//------------------------------------------------------------------------------------------------------------------+
OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера
int price = OrderOpenPrice();
//------------------------------------------------------------------------------------------------------------------+   
int sells = 0;                                                                                                                              
for (int B = 0; B < OrdersTotal(); B++)
   {
   OrderSelect (B,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sell
   if (OrderType() == OP_SELL) sells++;
   }
   
int buys = 0;                                                                                                                        
for (int b = 0; b < OrdersTotal(); b++)
   {
   OrderSelect (b,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buy 
   if (OrderType() == OP_BUY) buys++;
   }
int sellstops = 0;                                                                                                                              
for (int C = 0; C < OrdersTotal(); C++)
   {
   OrderSelect (C,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sellstop
   if (OrderType() == OP_SELL) sellstops++;
   }

int buystops = 0;                                                                                                                        
for (int c = 0; c < OrdersTotal(); c++)
   {
   OrderSelect (c,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buystop 
   if (OrderType() == OP_BUY) buystops++;
   }
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()==1)
   {                                               //удаление отложенного ордера..
   OrderDelete(2);                                 //..который остался после срабатываения tp и sl
   }  
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()>1 && A ==1)
   {
   if (sells == buys && buystops == 0)
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price,3,price-50*Point,price+25*Point,0,2);     //условия для первого варианта
      }
   if (buys > sells && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,2,price-28*Point,3,price+22*Point,price-53*Point,0,2);
      }
   }
   
if (OrdersTotal()>1 && A ==2)
   {
   if (sells == buys && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,1,price,3,price+50*Point,price-25*Point,0,2);     //условия для второго варианта
      }
   if (buys < sells && buystops == 0) 
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price+22*Point,3,price-28*Point,price+47*Point,0,2);
      }
   }
//-----------------------------------------------------------------------------------------------------------------+
   
   return(0);
   }
 
artmedia70:
这是来自一个指标还是来自一个EA?这是有区别的。一般来说,为了避免画出箭头,你需要检查指标中前一个相邻的条形图,如果它有一个非零或非空的值,这意味着相邻条形图上的箭头已经存在,没有必要将该值输入当前条形图缓冲区。对于一个EA来说,如果前一个相邻的条形图已经包含了一个与当前条形图相同方向的交叉事实,并且箭头已经标记了这个事实,那么当前条形图上的交叉事实可以不被注册(如果它存在的话),箭头也不需要显示。
我不能告诉你关于你的代码的任何其他情况。如果周围有心灵感应者,他们可能会在更大程度上理解你的代码;)

这来自于指标。2条滑道的交叉点,给出了方向。 我不太明白,只有在穿越时才会给出方向,而不是在每条杠上。 从这里来看,根据前一栏判断是不可能的....。告诉我,我们正在建造一个阵列,不是吗?如何检查前一个单元格?两个缓冲区,一个CrossUp[i]=Low[i]-Range*0.75;,另一个说 Cr[i]=Low[i]+Range*0.75;(只是不想再进入文件夹和代码。)
 
zaqwsx123:

如果其中一个挂单触发,那么我就在相反的方向上下另一个挂单,并将成交量增加一倍,例如,如果我下买入,那么我就在比买入低25点的地方下卖出止损,如果我下卖出,那么我就在高25点的地方下买入止损。如果其中一个挂单被触发,我们在与被触发的订单相反的方向上再下一个挂单,价格为第一个未平仓订单的价格,如果它也被触发,我们再次在25点内下一个与被触发的订单相反方向的挂单,等等。因此,所有的买单应该是一个价格,而所有的卖单也应该是一个价格。如果有人理解我在这里写的东西,请用代码帮助我))

你写了很多无稽之谈...至少是这样。

OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера

你确定选择的顺序是什么?你确定是这个价格吗?你确定该订单有一张票==1吗?当按票选择时,池子 是不相关的,所以MODE_TRADES在这里是多余的。在通过票据成功选择后,我们还应该检查所选订单的关闭时间。如果它==0,该订单在市场上,并被从市场订单列表中选择。 如果关闭时间>0,该订单要么被关闭,要么是一个被删除的挂单,并被从关闭订单列表中选择。

我不想进一步研究这些代码。也许,你应该先熟悉一下基础知识。阅读教程和文档--它们在这里的显著位置。

 
artmedia70:


我不想进一步研究这些代码...


引起我的注意))。为什么是4个相同的小鸡? 而且样本不是评论中的内容。

if (OrderType() == OP_BUY) buystops++   //количество ордеров buystop

自停也是如此,你需要 OP_BUYSTOP和 OP_SELLSTOP

 
ALXIMIKS:


引起我的注意))。为什么是4个相同的小鸡? 而且样本不是评论中的内容。

与selestop类似,你需要 OP_BUYSTOP和 OP_SELLSTOP

我没有走到那一步。当你看了代码,发现你不必解释错误,而只是从基础开始教一个人,他可以自己阅读,那么......。...我不想。你可以有偿教学,但不是你只是帮助寻找代码中的错误,而不是错误中的代码。
 
Zolotai:

这来自于指标。2张幻灯片的交叉点,给出了方向。 我不太明白,它只在穿越时给出方向,而不是在每个栏上。 从这里,我们不可能根据以前的bar.... 来判断。告诉我,我们正在建造一个阵列,不是吗?如何检查前一个单元格?有两个缓冲区:一个是CrossUp[i]=Low[i]-Range*0.75;另一个是,比如 Cr[i]=Low[i]+Range*0.75;(我只是不想再去搜索文件夹和代码了)
没有源数据。尝试在这里 搜索。
 
有一个BUY_STOP订单,在执行前已被删除。




检查代码。
            for(int cnt_1=OrdersHistoryTotal()-1; cnt_1>=0; cnt_1--) {
               if(OrderSelect(cnt_1, SELECT_BY_POS, MODE_HISTORY)==true ) {
                  if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
                     Print("OrderProfit()=",OrderProfit(), "   OrderCloseTime()=",TimeToStr(OrderCloseTime(),TIME_DATE|TIME_SECONDS), "   OrderType()=",OrderType(), "   OrderTicket()=",OrderTicket(), "   OrderClosePrice()=",OrderClosePrice(), "   OrderOpenPrice()=",OrderOpenPrice() );
                  } // if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
               }
            } // for(int cnt_1=0; cnt_1<OrdersHistoryTotal(); cnt_1++) {

有结果的字符串。
OrderProfit()=0   OrderCloseTime()=2001.01.26 06:15:00   OrderType()=4   OrderTicket()=24   OrderClosePrice()=0.9237   OrderOpenPrice()=0.9419

1, OrderType=4 - "4 "是OP_SELLLIMIT,对吗?
2.OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - OrderClosePrice()的值不等于OrderOpenPrice(),这是哪里来的?

 
chief2000:

有一个BUY_STOP订单,在执行前已被删除。




检查代码。

有结果的字符串。

1, OrderType=4 - "4 "是OP_SELLLIMIT,对吗?
2.OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - OrderClosePrice()的值不等于OrderOpenPrice()的值是怎么来的?

在测试器的可视化模式下,在所有的刻度线上,以逐步模式(F12暂停)找到其删除的时刻,看看当前价格,也许狗就藏在那里?
 
artmedia70:
而你在测试器的可视化模式下,是的,在所有刻度上,在步骤模式下(F12在暂停时)找到其删除的时刻,并看到当前的价格,也许这就是狗被埋葬的地方?


BINGO!不知道,但都和你写的一样,也就是说,这种情况下的收盘价 是删除订单时的价格值。谢谢你!
 

通常我在函数中会这样声明一个变量。

int err = GetLastError();

再往里走,在某个条件下,我已经调用它,看看是否有错误。好吧,不仅是我,我遇到的许多其他地方的代码。所以说,这是一个典型的情况。我今天想,在你想控制错误的每个函数中,每次都声明相同的变量,这是不符合逻辑的。我想了想,得出的结论是,在全局范围内声明一次,并在init中初始化它,会更容易。它是这样的。

// Объявили на глобальном уровне
int err;

// Инициируем данную переменную:
int init()
{
    err = GetLastError();
}

还有,当你需要在用户函数中调用err变量时,知道它已经有一个值。事实上,GetLastError() 输出的是最后一个错误 的代码,所以如果在所有计算结束后的每个函数中都调用这个变量err,负责输出错误代码,并调用GetLastError(),那么一切就都正确了,对吗?

但是,如果你不在某个函数的结尾调用这个变量(跟随代码执行链),它就不会被重置,而且可能是错误的执行,万一在之前的执行链中有错误,但在当前的执行链中没有,但错误代码最后被返回......而要重置它,你必须调用这个函数GetLastError()。也就是说,这里的一切都取决于它是否被调用。如果你不确定它将无处不在,那么每次都重新保险和重置就更容易了,对吗?