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

 
wishmast:

伙计们,我已经绞尽脑汁了。我如何让EA在高点和低点下挂单,例如8根蜡烛,获利1/4。

我做的事情是这样的。

double Vhod1=iHighest(Symbol(),0,MODE_HIGH,8,0)。

double Vhod2=iLowest(Symbol(),0,MODE_LOW,8,0)。

双TP=((Vhod1-Vhod2)/4)+Vhod1。


我试图改变参数,但一直得到错误的止损,或将价格设定在7.00000;不清楚它来自哪里。

iHighest, iLowest将给你提供蜡烛图的地址,但不提供价格。
 
evillive:
iHighest, iLowest将给出蜡烛的地址,而不是价格。

这就对了。我们需要

double Vhod1=iHigh(Symbol(), 0,iHighest(Symbol(),0,MODE_HIGH,8,0))。

double Vhod2=iLow(Symbol(), 0, iLowest(Symbol(),0,MODE_LOW,8,0))。

 
alvlaf:


我把它放错了,但它仍然不会正常工作,因为......。因为。)总之,它应该是这样的。

1) 在inite中创建一个AllowNewOrders变量(如果它不存在)。

2) 创建一个新的订单,直到它关闭,这个符号的OnTick是空闲的,但将运行另一个符号的OnTick

3) 对其他符号执行第2步,直到达到MaxOpenOrders限制。

4) 当订单完成时,如果它是亏损或价值为零,通过AllowNewOrders禁止为所有副本开立新的订单。

[这里有一个直接的问题--当输掉的系列结束时,AllowNewOrders=1,但是如果MaxOpenOrders>1并且有几个这样的会议呢?]

5) 如果第4点没有得到满足,那么你可以开新的订单。

当MaxOpenOrders=1时,该程序必须工作。也许,如果我们在一个无利可图的订单之后禁止新的订单,AllowNewOrders=0,而下一个OrderSend,由于某种原因,没有打开订单,就会出现问题。我将在下面写出我是如何对冲这个案例的...

int OnInit()                     
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders", 1);
   return(INIT_SUCCEEDED);
}
//----------------------------------------------------------------------
void OnTick()
{
   if (CountTrades() == 0)  // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 
      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)
      // Если последняя сделка прибыльная или это первая сделка, то открывается ордер
      {
         if (OrdersTotal() >= MaxOpenOrders || GlobalVariableGet("AllowNewOrders") == 0) return;
         if (SignalBuy())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
         if (SignalSell())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
      }
   }
}
 
A13ksandr:

我将在下面写出我是如何为这种情况保值的......

int Tries = 5;
ResetLastError();
do
{
   // решение ошибок с предыдущей попытки открытия ордера, например:
   if (_Error == 134)
   {
      _Lot = NormalizeDouble(_Lot / 2, 2);
      if (_Lot < SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)) _Lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   }
   if (_Error == 138) RefreshRates();
   Ticket = OrderSend(Symbol(), OP_BUY, _Lot, Ask, 3, 0, 0, NULL, 0, 0, clrNONE);
   if (Ticket < 0)
   {
      _Error = GetLastError();
      Sleep(100);
   }
   Tries--;
}
while (Ticket < 0 && Tries > 0);

如果正确预见错误解决方案,开单的成功率就会提高。

 
你好!请告诉我,如果我使用帖子中的功能(每个订单都有自己的魔术师)- http://forum.forexpeoples.ru/showthr...=1#post1715092 ,如果不是每个订单都有自己的魔术师,而是每个系列的订单都有自己的魔术师,那么如何找到销售或购买的最后一个订单,或者升级一系列的订单。即假设当一个新系列的订单有自己的魔力被打开时,旧系列的订单继续用自己的魔力打开自己的订单。每个系列预计都有自己的利润,而且有很多这样的系列订单。


for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continue;

我把代码放到了一个系列的第一笔订单时生成一个magik,但在同一系列中打开新的订单时,问题出现了。

从帖子中生成魔法的代码本身:
//+------------------------------------------------------------------+
//获得系列中的下一个魔法
int getNextMagicNumber(){
int magic = EMPTY;

if (OrdersTotal() == 0) {
return(startMagicNumber);
}

for (int i = startMagicNumber; i < startMagicNumber + MaxTrades; i++){
magic = checkMarketByMagic(i);
if (magic != EMPTY) break;
}

if (magic == EMPTY){
magic = startMagicNumber; //系列中的第一个
} else {
magic++; //系列中的下一个
}

return(magic);
}
//+------------------------------------------------------------------+
// keekkenen: 检查市场中是否有给定magic的订单
int checkMarketByMagic(int magic){
for(int i = 0; i < OrdersTotal(); i++) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != Symbol() continue;
if(OrderMagicNumber() == magic) return(magic);
}
return(EMPTY) ;
}
//+------------------------------------------------------------------+
 
下午好,论坛的先生们,
,如果我混淆了主题,请原谅,但我没有找到正确的地方来发布THEME,所以不要踢我。

有时,在互联网上浏览新的专家顾问系统时,我遇到一个我没有注意的,因为它的描述是标准的,其中有很多,但我没有注意到它的名字。

如果我没有见过或者读过,请告诉我名字,谷歌会做它的工作,或者如果我有,我会把它作为礼物。也许有一个类似的顾问执行类似的行动。

我将描述专家顾问的含义(没有什么非常复杂的东西,我现在需要的)。

粗略地说,这项工作看起来是这样的:

1.手动开仓,比如说买入。
2.专家顾问根据设置设置了止损和止盈。
3.该订单在止盈时被关闭--EA立即开启另一个买入,并设置相同的止损和止盈,直到赶上第一个止损或有最终止盈。
4.如果通过止损关闭头寸,机器人就不再做任何事情。专家顾问等待下一个订单被手动打开。

这就是全部。

我将非常感激。
 
A13ksandr:


我把它插错了,但还是不能正常工作,因为...因为。)总之,事情是这样的。

1) 在initem中创建一个AllowNewOrders变量(如果它不存在)。

2) 创建一个新的订单,直到它关闭 这个符号的OnTick是空闲的,但其他符号的OnTick将工作

3) 对其他符号执行第2步,直到达到MaxOpenOrders限制。

4) 当订单完成时,如果它是亏损或价值为零,通过AllowNewOrders禁止为所有副本开立新的订单。

[这里有一个直接的问题--当输掉的系列结束时,AllowNewOrders=1,但是如果MaxOpenOrders>1并且有几个这样的会议呢?]

5) 如果第4点没有得到满足,那么你可以开新的订单。

当MaxOpenOrders=1时,该程序必须工作。也许,如果我们在一个无利可图的订单之后禁止新的订单,AllowNewOrders=0,而下一个OrderSend,由于某种原因,没有打开订单,就会出现问题。我将在下面写出我是如何对冲这种情况的。

谢谢你,亚历山大,我明天会检查的。[因此,问题马上就来了--当输掉的系列结束时,AllowNewOrders=1,如果MaxOpenOrders>1并且有几个会话?]如果MaxOpenOrders>1的某个值,那么在想法中AllowNewOrders=1也应该大于相同的值。但我们不需要为此费心,MaxOpenOrders根本就应该被删除,因为在这个版本的程序中,无论如何我们都不会计划超过一个系列。
 
alvlaf:
谢谢你,亚历山大,我明天会检查的。[因此问题马上就来了--当输掉的系列结束时,AllowNewOrders=1,但如果MaxOpenOrders>1且有多个会话?]如果MaxOpenOrders>1的某个值,那么在想法中AllowNewOrders=1也应该大于相同的值。但我现在不需要为它费心,MaxOpenOrders应该被完全省略,因为在这个版本的程序中,无论如何都不会有超过一个系列的计划。
我试了一下,头五分钟工作正常,然后我开始一次打开几个交易(4个),而且是同一对较大的手数。亚历山大,我不太明白在你的版本中,全局变量 是如何获得和改变其值的?
 

大家好!

这里是图形上的一个图形对象。

它的参数是时间,价值,代码。该值对应于该对象所在的价格。

有什么方法可以得到它的时间和价值吗(通过一个函数或其他东西)?

\\\\\

或者,从更广泛的意义上讲,是否有任何对象(除了趋势线、斐波那契线、甘尼特)能够让我们即时获得它们的时间和价格?

我需要在图表上放置一些标记,并从中获取信息。绘制趋势线、菲博等...- 它是非常繁琐和缓慢的...

谢谢你的回答 !

PS 刚刚开始学习...

 
ilmel:

大家好!

这里有一个图形对象在一个图形上。

它的参数是时间,价值,代码。该值对应于该对象所在的价格。

有什么方法可以得到它的时间和价值吗(通过一个函数或其他东西)?

\\\\\

或者,在更广泛的背景下,是否有任何对象(除了趋势线、斐波那契线、甘尼特)可以在时间和价格上立即得出?

我需要在图表上放置一些标记,并从它们那里获得信息。绘制趋势线、菲博等...- 它是非常繁琐和缓慢的...

谢谢你的回答!

PS 刚刚开始学习...

https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger