[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 45

 

¿Podría decirme si he puesto"mn" en el código correctamente o no?

//+----------------------------------------------------------------------------------------+
//| ММ Функция работает по принципу наращивания лота при увеличении                        |
//| депозита, и уменьшении лота при серии убыточных сделок лот возвращается                |
//| на начальный лот в данном случае 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);} 
 
Por favor, sugiera una "condición" de tiempo para que el EA se encienda a una hora determinada, que pueda establecer
 
He encontrado un script que cierra todas las órdenes, quiero insertarlo en un EA, necesito esta condición =(
 
Tiken123:
Por favor, sugiera una "condición" de tiempo para que el EA se encienda a una hora determinada, que pueda establecer
Aquí.
 
¡¡¡Gracias!!!
 
BeerGod:

Por favor, dígame si he añadido"mn" al código correctamente o no, para que el número Magic pueda ser rastreado en MM.

Si Magic se declara como variable global o constante:

int mn = ****;

y así estructuralmente sin errores (pequeña edición de sintaxis):

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);
}

Debe normalizar el lote por la multiplicidad de MODE_LOTSTEP, de lo contrario, tarde o temprano tropezará con el error 131 (ERR_INVALID_TRADE_VOLUME).

Bueno, y las variables no declaradas en la función en su conciencia... :)

 
Cómo lo hago: necesito establecer una nueva orden en el nivel correcto después de cerrar una orden particular. He intentado escribirlo así, pero no se abre... ¿Cómo se escribe correctamente?
//-- Открытие ордеров  после закрытия
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);
               }  
            }
         }
 

Hola,

Necesito ayuda profesional (alguien que sepa de estas cosas...).

No consigo que la idea funcione... Lo encontré todo y lo puse en el robot pero sigue sin funcionar así =(

Quiero cerrar todos los beneficios.

Quiero cerrar todas las posiciones rentables cuando la rentabilidad total sea mayor que la pérdida total. Trato de cerrar todas las posiciones rentables (Ganancias> Pérdidas)

 

Ayuda con el código. La condición (Beneficio total>Pérdida total) para cerrar todas las operaciones rentables no funciona

Necesito que cuente las operaciones perdedoras desde el momento del "saldo máximo" para cerrar todas las operaciones rentables a medida que alcanzan un beneficio superior a la totalidad de las pérdidas, y empezar a contar de nuevo las operaciones perdedoras con el nuevo depo

¿Alguien ha visto un Asesor Experto que lleve la cuenta del saldo de un depósito, por ejemplo, la operación empezó con un saldo de 50... empezaron las pérdidas, el Asesor Experto debería recordar cuanto ha bajado el saldo, para que en la próxima vez que el beneficio de las posiciones abiertas supere esta pérdida, debería cerrar todas las operaciones rentables, y empezar a contar las pérdidas de nuevo.

   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);
}
 

¿Cómo puedo saber si las últimas órdenes 1-2-3 fueron perdedoras?

¿Cómo puedo saber cuál fue el último pedido?

Por ejemplo, necesito saber si un límite de compra pendiente se activó y, si lo hizo, a qué precio y luego colocar uno nuevo.

¿Cómo puedo saber si la orden se ha disparado en un trailing stop y luego colocar una nueva orden después de que se haya disparado el trailing stop?