Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 711

 
LBatters:

Ciao a tutti)

Ho provato a scrivere una funzione per chiudere una parte della posizione, ma quando la eseguo nel tester, 138 sta spuntando un errore, non capisco quale sia il problema.

Ecco un EA in cui questa funzione dovrebbe funzionare)

138 - "Il prezzo richiesto non è aggiornato o l'offerta e la domanda sono confuse".

Ilprezzo di apertura/chiusura non può essere ricalcolato, perché è lì, ed ecco il problema(è necessario richiedere il prezzo e dargli un valore usando MarketInfo, e rinominare questo in un'altra variabile):

                 PriceCl    = NormalizeDouble((takeprofit + OrderOpenPrice())/t,Digits);  //примерную цену закрытия
                 order = OrderTicket();    //получили ордер
                 if(Bid>PriceCl) //если текущая цена оказалась выше нашей цены ,то закрываем часть ордера
                 {OrderClose(order,NormalizeDouble(lot*percent/100,2),PriceCl,3);}
 
7Konstantin7:

Ciao a tutti.

Sto cercando di aggiornare un semplice EA trawl di Kim per cancellare gli ordini pendenti dopo aver chiuso tutti gli ordini a mercato, non ci riesce(

Ho aggiunto la funzione per cancellare gli ordini in sospeso:

Ho trovato un altro problema che non posso risolvere perché non sono troppo bravo a programmare.

Credo che dovrei scrivere una condizione come:

Questo è solo un esempio di un altro EA.


Per favore, aiutatemi.

Kostya, avvia un ciclo calcolando il numero di ordini dei tipi richiesti e poi cancellalo come vuoi.
 
_new-rena:
Kostya, fai un ciclo per calcolare il numero di ordini per i tipi richiesti, poi cancella come vuoi, non fare il saggio.

Sono un nerd del codice) Ho aggiunto più pause lì, forse aiuterà)

  if (OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
 
7Konstantin7:

Sono un nerd del codice ) ho aggiunto qualche pausa in più, forse aiuterà).

L'evidenziato non è il problema. Il problema è che prima di aggiungere le pause avresti dovuto pensare: "Cosa ci guadagni?". Non farà nulla... e ha senso aggiungerlo?

Non ho capito il resto, sono ubriaco e non rispetto i codici di Kim... scusate...

 
AlexeyVik:

L'evidenziato non è il problema. Il problema è che prima di aggiungere gli ordini pendenti avresti dovuto pensare "Cosa ci guadagni?". Non farà nulla... e ha senso aggiungerlo?

E il resto non ho capito, sono ubriaco e i codici di Kim non rispettano... mi dispiace...

Niente) Ho pensato così, devo scrivere una condizione e ora sto pensando.

Sì, i codici non sono per reali in esso) almeno per libero, circa pagato non so.

 
7Konstantin7:

Non ha fatto niente) ho pensato così, devo scrivere una condizione, sto pensando.

Non so come fare, ma ho un codice diverso per quelli veri.

Per quelli veri, ogni casa di intermediazione ha il suo codice, quindi non ce n'è uno universale.

 

Problema risolto) ha pensato a lungo e duramente) grazie a tutti.

   if (gdProfit>BEGIN_PROFIT) {
    ClosePosFirstProfit();
    if (DeleteOrders) DeleteOrders();
  }
 

Ciao a tutti!

Sto affrontando un problema con gli ordini di chiusura dei contatori su un cinque marker. Il punto è che ho bisogno di chiudere, diciamo, 20 ordini di acquisto e 33 ordini di vendita quando il profitto totale è raggiunto. E voglio chiudere 20 ordini di acquisto e 20 ordini di vendita usando la funzione OrderCloseBy(), e chiudere i rimanenti 13 ordini di vendita usando la funzione OrderClose().

Se abbiamo uno spread fisso a 4 cifre, non avremo problemi con la chiusura dello spread e salviamo anche lo spread quando usiamo la funzione OrderCloseBy(). Se abbiamo uno spread a 5 cifre, lo spread è fluttuante ed è per questo che, credo, gli ordini non vengono chiusi quando si raggiunge il profitto totale, e la funzione OrderCloseBy() sostiene nel log. Allo stesso tempo, se lo facciamo funzionare nel tester, tutto si chiude normalmente.

Gli ordini in una direzione, quando il profitto totale viene raggiunto, vengono chiusi senza problemi.

Chi ha incontrato un tale problema e quali sono le opzioni per risolverlo?

Ecco la funzione per chiudere gli ordini.

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}  
 

Per favore consigliate come chiudere gli ordini nell'ordine in cui sono stati aperti.

Voglio rifare questa funzione:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; 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) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; 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) ClosePosBySelect();
        }
      }
    }
  }
}
 
7Konstantin7:

Per favore consigliate come chiudere gli ordini nell'ordine in cui sono stati aperti.

Voglio rifare questa funzione:

La risposta è ovvia. Ordina le posizioni aperte in base al tempo della loro apertura. E poi chiuderli nella lista dall'array ordinato.
Motivazione: