[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 45

 

Potreste dirmi se ho messo"mn" nel codice correttamente 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);} 
 
Per favore suggerite una "condizione" di tempo per l'accensione dell'EA a una certa ora, che posso impostare
 
Ho trovato uno script che chiude tutti gli ordini, voglio inserirlo in un EA, ho bisogno di questa condizione =(
 
Tiken123:
Per favore suggerite una "condizione" di tempo per l'accensione dell'EA a una certa ora, che posso impostare
Qui.
 
Grazie!!!
 
BeerGod:

Per favore ditemi se ho aggiunto"mn" al codice correttamente o no, in modo che Magic number possa essere rintracciato in MM?

Se Magic è dichiarato come variabile globale o costante:

int mn = ****;

e quindi strutturalmente senza errori (piccola modifica della sintassi):

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

Dovreste normalizzare il lotto per molteplicità MODE_LOTSTEP, altrimenti vi imbatterete prima o poi nell'errore 131 (ERR_INVALID_TRADE_VOLUME).

Bene, e variabili non dichiarate nella funzione sulla vostra coscienza... :)

 
Come faccio: ho bisogno di impostare un nuovo ordine al livello giusto dopo aver chiuso un ordine particolare. Ho provato a scriverlo in questo modo, non si apre... Come scriverlo correttamente?
//-- Открытие ордеров  после закрытия
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);
               }  
            }
         }
 

Salve,

Ho bisogno di un aiuto professionale (qualcuno che conosce queste cose...).

Non riesco a far funzionare l'idea... Ho trovato tutto e l'ho messo nel robot ma ancora non funziona così =(

Voglio chiudere tutti i profitti.

Voglio chiudere tutte le posizioni redditizie quando la redditività totale è maggiore della perdita totale. Cerco di chiudere tutte le posizioni redditizie (Profitto>Perdita)

 

Aiuto con il codice. La condizione (Profitto totale>Perdita totale) per chiudere tutti i trade redditizi non funziona

Ho bisogno che conti i trade perdenti dal momento del "saldo massimo" per chiudere tutti i trade redditizi quando raggiungono un profitto superiore all'intera perdita, e ricominciare a contare i trade perdenti con il nuovo depo

Qualcuno ha visto un Expert Advisor che tiene traccia del saldo del deposito, per esempio, il trade è iniziato con un saldo di 50... le perdite sono iniziate, l'Expert Advisor dovrebbe ricordare quanto è sceso il saldo, in modo che la prossima volta che il profitto delle posizioni aperte supera questa perdita, dovrebbe chiudere tutti i trade redditizi, e iniziare a contare di nuovo le perdite.

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

Come faccio a sapere se gli ultimi ordini 1-2-3 sono stati perdenti?

Come faccio a sapere qual è stato l'ultimo ordine?

Per esempio ho bisogno di sapere se un limite di acquisto pendente è scattato e, se l'ha fatto, a quale prezzo e quindi piazzarne uno nuovo.

Come posso sapere se l'ordine è scattato su un trailing stop e poi piazzare un nuovo ordine dopo che il trailing stop è scattato?