[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 256

 
hoz:


昨天我很着急,不得不去。我在那一刻写的问题不是我想要的问题。

实际上,我指的是专家顾问,它在给定的条件下,发送一堆订单(一个网格)。我没有看到在这样的专家顾问系统中,点差、止损、高于(低于Asc或Bid)的价格位置,以及其他任何东西都没有被检查。我打算自己写,给大家看。


为什么还要拿一些戈壁专家来做例子?至少它们只是为测试者服务的,最多是用歪手写的,如上所述......
 
alsu:

为什么要拿一些悲惨的专家来做例子呢?至少它们只是为测试者服务的,最多是用歪手写的,如上所述......

好吧,我明白如何实现它,但决定看看别人是如何做的。
 

伙计们,我遇到了一个非常可怕的问题!当我保存图画时,我的图画不会向左移动!"移位图 "功能已被激活!我怎样才能解决这个问题?


 

你好!

我希望我的专家顾问每天开出的交易不超过一个。你能告诉我如何做到这一点吗?

 

你好,我研究mql4已经有一段时间了,也许有经验的程序员可以帮忙。我想知道如何在订单达到-30或-40时将其锁定。 我必须为这个脚本添加一些属性,以便在订单进入负值时立即锁定。

void start()
{
double StopLoss;
double Lots=0;
for(int i=0;i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS))
continue;
if(OrderSymbol()!=符号())
继续;
if(OrderType()==OP_BUY)
Lots+=OrderLots();
if(OrderType()==OP_SELL)
Lots-=OrderLots();
}
if(Lots>0)
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,0,NULL,Red) 。
if(Lots<0)
OrderSend(Symbol(),OP_BUY,-(Lots),Ask,3,Bid-StopLoss*Point,0,NULL,Blue) 。

 
protey7:

你好!

我希望我的专家顾问每天开出的交易不超过一个。你能告诉我如何做到这一点吗?

extern int MagicNumber=555;
//---
if (OrdersTotal()>0) // Есть ли отложенные ордера или открытые позиции
{  for (i=OrdersTotal()-1; i>=0; i--) // Перебираем ордера
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // Oрдер выбирается среди открытых и отложенных ордеров
      {  if (OrderSymbol()!=Symbol()) continue; // Если торговый символ не тот, на котором работает эксперт - игнорируется
         if (OrderMagicNumber()!=MagicNumber) continue; // Если магик номер не тот, что надо - игнорируется
         if (OrderOpenTime()>=iTime(NULL,PERIOD_D1,0)) // Если время открытия ордера больше или равен началу открытия данной свечи,
                                                       // то дальший код эксперта не работает. Вместо PERIOD_D1 можно вставить любой другой период.
            return(0);
}  }  }
 
Wild_Wolf:

伙计们,我遇到了一个非常可怕的问题!当我保存图画时,我的图画不会向左移动!"移位图 "功能已被激活!我怎样才能解决这个问题?

注意:在图形的右上方,有一个这样的小三角形。当你把光标悬停在它上面时,会弹出一个工具提示说 "图表转移"。钩住它,并尽可能多地把它移到左边,以便在右边腾出空间。
 
hoz:

好吧,我明白如何实施它,但我决定看看别人是如何做的。
如果其他人开始从窗户跳出去怎么办?
 
paladin80:


谢谢你的提示!

只有在建议的变体中,专家不工作))))下面是我得到的一个工作变体。

如果(OrdersTotal()==0) // 如果没有未结头寸

{ for (int i=OrdersHistoryTotal()-1; i>=0; i--) // 从账户历史列表中搜索订单。

{ 如果(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //该订单在已关闭的订单中被选中。

{

if (OrderCloseTime()>=iTime(NULL,PERIOD_D1,0)) // 如果订单收盘时间大于或等于当前蜡烛的开盘时间。

// 专家顾问不工作。可以插入任何其他周期来代替PERIOD_D1。

返回(-1)。

} }}

 
alsu:

你为什么还要拿一些窝囊废来做例子呢?最低限度,它们是专门为测试人员设计的,最高限度,它们是用弯曲的手写的,正如上面所说的......


用我的方式写的。我没有特别优化代码,只是写了它,让它发挥作用,并展示了逻辑。

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double initialOOP, int i)
{
   int ticket;
   
   ticket = OrderSend(Symbol(), OP_BUYSTOP,0.1,NormalizeDouble(Ask + (step*i) * pt, Digits),3,0,0,NULL,i_magic,0,CLR_NONE);
   
   if (ticket > 0)
       return (true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double initialOOP, int i)
{
   int ticket;
   
   ticket = OrderSend(Symbol(), OP_SELLSTOP,0.1,NormalizeDouble(Bid - (step*i)*pt, Digits),3,0,0,NULL,i_magic,0,CLR_NONE);
   
   if (ticket > 0)
       return (true);
}
//+-------------------------------------------------------------------------------------+
//| Посылаем пачку ордеров на сервер                                                    |
//+-------------------------------------------------------------------------------------+
bool SendPackOfOrders(int lastPosTicket, int lastPosType, double initialOOP)
{
   if (lastPosTicket == -1)                        // Если нет рыночных ордеров, значит..
       return(false);                              //..сетку отложек не кидаем
       
  // if (lastPosType != g_lastPosType)               // Если тикет изменился, значит..
   {
      lastPosType = g_lastPosType;
      
      for (int i=1; i<=5; i++)
      {
         if (!OpenBuy(initialOOP, i))
             return(false);
         if (!OpenSell(initialOOP, i))
             return(false);
      }
   }
}

一步 是订单网格的间距。

我的问题是这样的。我的逻辑是否正确?有什么方法可以改进代码,使其工作得更快?从性能的角度来看...

我还有一个想法,我们可能需要在每条信息之后做停顿。好吧,总之这些观点对我来说非常有趣。