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

 

请你告诉我,我在代码中的"mn"是否正确?

//+----------------------------------------------------------------------------------------+
//| ММ Функция работает по принципу наращивания лота при увеличении                        |
//| депозита, и уменьшении лота при серии убыточных сделок лот возвращается                |
//| на начальный лот в данном случае 0.1 если происходит профит то следующий               |
//| лот расчитывается по прогресии.                                                        |
//| К примеру при депозите 500 старт лота будет равен 0.1 далее депозит                    |
//| увеличивается до 5000 лот будет равен 1 если будет две убыточные сделки                |
//| лот уменьшится от предыдущего деленое на DecreaseFactor = 3, если по далее             |
//| две сделки будут убыточные,уменьшится от предыдущего деленое на DecreaseFactor = 3,    |
//| далее если сделка будет прибыльной то следующий лот откроется из расчета               |
//| баланса депозита "баланс/500*0.1"=лот внешние переменные                               |
//+----------------------------------------------------------------------------------------+

double LotsOptimized() {
       double minlot = MarketInfo(Symbol(), MODE_MINLOT);
       double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);       
       double lot = Lots;
       int orders = OrdersHistoryTotal();
       int losses = 0;
       lot = NormalizeDouble((AccountFreeMargin()- AccountCredit()) * MaximumRisk / balans, 2);
       if (DecreaseFactor > 0.0) {
for (int i = orders - 1; i >= 0; i--) {
       if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == FALSE) {
       Print("Error in history!");
       break;
       }
if (OrderSymbol() != Symbol() || OrderType() > OP_SELL || OrderMagicNumber()!=mn) continue;
if (OrderProfit() > 0.0) break; 
if (OrderProfit() < 0.0) losses++;
}
if (losses > 1) lot = NormalizeDouble(lot - lot * losses / DecreaseFactor, 2);
}
if(lot < minlot) lot = minlot;
if(lot > maxlot) lot = maxlot; 
return (lot);} 
 
请建议一个时间 "条件",让EA在某一时间开启,我可以设置这个条件。
 
我发现了一个关闭所有订单的脚本,我想把它插入到EA中,我需要这个条件 =(
 
Tiken123:
请建议一个时间 "条件",让EA在某一时间开启,我可以设置这个条件。
在这里
 
谢谢你!!!。
 
BeerGod:

请告诉我,我是否在代码中正确地添加了"mn",以便在MM中跟踪魔术号码?

如果Magic被声明为全局变量 或常量。

int mn = ****;

等结构上没有错误(小的语法编辑)。

double LotsOptimized()
{
    double minlot = MarketInfo (Symbol(), MODE_MINLOT),
           maxlot = MarketInfo(Symbol(), MODE_MAXLOT),       
           lot = Lots, ld_Profit = 0.0;
    int    orders = OrdersHistoryTotal(), losses = 0;
//----
    lot = NormalizeDouble ((AccountFreeMargin() - AccountCredit()) * MaximumRisk / balans, 2);
    if (DecreaseFactor > 0.0)
    {
        for (int i = orders - 1; i >= 0; i--)
        {
             if (!OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {Print ("Error in history!"); break;}
             if (OrderSymbol() != Symbol()) continue;
             if (OrderType() > OP_SELL) continue;
             if (OrderMagicNumber() != mn) continue;
             ld_Profit = OrderProfit();
             if (ld_Profit > 0.0) break; 
             if (ld_Profit < 0.0) losses++;
        }
        if (losses > 1) lot = NormalizeDouble (lot - lot * losses / DecreaseFactor, 2);
    }
    if (lot < minlot) lot = minlot;
    if (lot > maxlot) lot = maxlot; 
//----
    return (lot);
}

你应该通过MODE_LOTSTEP的倍数来规范交易,否则你迟早会遇到错误131(ERR_INVALID_TRADE_VOLUME)。

好吧,还有没有在函数中声明的变量是你的良知......:)

 
我如何做:我需要在关闭某个订单后在正确的水平上设置一个新的订单。我试着这样写,它没有打开...如何正确书写?
//-- Открытие ордеров  после закрытия
if  (OrderSelect(Ticket_B,SELECT_BY_TICKET,MODE_TRADES)==false)
     {Ticket_B=0;}
if  (OrderSelect(Ticket_B_1,SELECT_BY_TICKET,MODE_TRADES)==false)
     {Ticket_B_1=0;}
if  (OrderSelect(Ticket_B_2,SELECT_BY_TICKET,MODE_TRADES)==false)
     {Ticket_B_2=0;}

...

       if (Ticket_B==0)    // в этом месте пробовал и (Ticket_B<1), тоже никак
        {                                     
         SL=Bid - New_Stop(StopLoss)*Point;     
         TP=Ask + New_Stop(TakeProfit)*Point;   
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket_B=OrderSend(Symbol(),OP_BUY,Lts,Ask,1,SL,TP,"121212",121212,0,CLR_NONE);
         if (Ticket_B > 0)                       
           {
            Alert ("Открыт ордер Buy ",Ticket_B);
            OrderSelect(Ticket_B,SELECT_BY_TICKET,MODE_TRADES);
            one_price=OrderOpenPrice();
         if (Fun_Error(GetLastError())==1)     
            continue;                           
         return;                              
           }
        }
        
 
        
//-- Открытие ордеров -- BuyStop
       if (Up>=1 && Ticket_B_1<1)
        {
         SL_1=SL;
         TP_1=one_price + StepUp*Point + New_Stop(TakeProfit)*Point;
         Ticket_B_1=OrderSend(Symbol(), OP_BUYSTOP, Lts, one_price + StepUp*Point, 1, SL_1, TP_1,"121212",121212,0,CLR_NONE);
           {
            Alert("Торговый приказ B2 отправлен на сервер. Ожидание ответа..");
            if (Ticket_B_1>0)
              {
               Alert ("Установлен ордер BuyStop ",Ticket_B_1);
               }  
            }
         }
 

你好。

我需要一些专业的帮助(知道这个东西的人......)。

我不能让这个想法发挥作用......我找到了所有的东西,并把它放到机器人中,但它仍然不能这样工作=(

我想关闭所有的利润。

我想在总盈利大于总亏损时关闭所有盈利的头寸。我尝试关闭所有盈利的头寸(盈利>亏损)。

 

对代码的帮助。关闭所有盈利交易的条件(总利润>总损失)不起作用。

我需要它从 "最大余额 "的时刻开始计算亏损的交易,以关闭所有盈利的交易,因为它们达到的利润超过了整个损失,并在新的存款中重新开始计算亏损的交易。

有没有人见过一个专家顾问可以跟踪存款余额,例如,交易开始时余额为50......损失开始时,专家顾问应该记住余额下降了多少,以便在下一次未结头寸 的利润超过这一损失时,它应该关闭所有盈利的交易,并重新开始计算损失。

   if (GetProfitOpenPosInCurrency()>NumberOfLossPosToday()) 
   int slippage=1;
   int ask, bid, open;
   double point;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderType()==OP_BUY)
      {
         point=MarketInfo(OrderSymbol(),MODE_POINT);
         if (point==0) break;
         bid=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point);
         open=MathRound(OrderOpenPrice()/point);
         if (bid-open<Profit) continue;
         OrderClose(OrderTicket(),OrderLots(),bid*point,slippage);
      }
      if (OrderType()==OP_SELL)
      {
         point=MarketInfo(OrderSymbol(),MODE_POINT);
         if (point==0) break;
         ask=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point);
         open=MathRound(OrderOpenPrice()/point);
         if (open-ask<Profit) continue;
         OrderClose (OrderTicket(),OrderLots(),ask*point,slippage);
      }
   }
}
//--------------------------------------------------------------------
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(p);
}
//--------------------------------------------------------------------
int NumberOfLossPosToday(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              t=OrderCloseTime();
              if (Year()==TimeYear(t) && DayOfYear()==TimeDayOfYear(t)) {
                if (OrderProfit()<0) kp++;
              }
            }
          }
        }
      }
    }
  }
  return(kp);
}
 

我如何知道最后的1-2-3订单是否丢失?

我怎么知道最后一个订单是什么?

例如,我需要知道一个挂起的买入限价是否触发,如果触发了,在什么价位,然后放置一个新的。

我如何知道订单是否已经触发了追踪止损,然后在追踪止损被触发后再下新的订单?