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

 
MisterD:
Ciao di nuovo, puoi dirmi per favore dove c'è un errore nel seguente codice?
Chiamo il ciclo al momento del "deinit".
Cancella tutto tranne l'ultimo ordine.
Penso che questa linea sia molto probabilmente un errore >> for (int i=1; i<=OrdersTotal(); i++) <<
Comunque, logicamente tutto sembra essere corretto... cosa mi sono perso?

Grazie in anticipo!


Fare il ciclo al contrario

//-------------------------------------------------------------------------------------------
for (int i=OrdersTotal()-1; i>=0; i--)
{
   if (OrderSelect(i,SELECT_BY_POS)==true)
   {
      int Type=OrderType();
      if (OrderSymbol()!= Symbol() || Type <2)continue;
      int Ticket=OrderTicket();
      bool Modify =OrderDelete(Ticket);
      if (Modify == true) Alert ("Ордер Удалён");continue;
      if (Modify != true) Alert ("Удаление ордера не удалась");
   }
} 
//-------------------------------------------------------------------------------------------
 
MisterD:
Ciao di nuovo, puoi dirmi per favore dove c'è un errore nel seguente codice?
Chiamo il ciclo al momento del "deinit".
Cancella tutto tranne l'ultimo ordine.
Penso che questa linea sia molto probabilmente un errore >> for (int i=1; i<=OrdersTotal(); i++) <<
Comunque, logicamente tutto sembra essere corretto... cosa mi sono perso?

Grazie in anticipo!

//-------------------------------------------------------------------------------------------
per (int i=1; i<=OrdiniTotali(); i++)
{
se (OrderSelect(i-1,SELECT_BY_POS)==true)
{
int Type=OrderType();
se (OrderSymbol()!= Symbol() || Type <2)continua;
int Ticket=OrderTicket();
Modify=OrderDelete(Ticket);
if (Modify == true) Alert ("Order Deleted"); continuare;
if (Modify != true) Alert ("Order deleted failed");
continuare;
}
}
//-------------------------------------------------------------------------------------------


Prova così:

for(int i=OrdersTotal()-1;i>=0;i--) {
  if(OrderSelect(i,......................
 

Buon pomeriggio. è necessario un piccolo aiuto. c'è una funzione che chiude uno dei lotti più grassi in termini di profitto.

Ho bisogno di metterlo in loop.

Si prega di consigliare come utilizzare questa funzione, per esempio se il mio account equity è più di 5 pips allora questa funzione dovrebbe funzionare.

void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  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 (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  } 

}

 
sannin:

Buon pomeriggio. è necessario un piccolo aiuto. c'è una funzione che chiude uno dei lotti più grassi in termini di profitto.

Ho bisogno di metterlo in loop.

Ad esempio, se il mio conto è superiore a 5 pips, questa funzione dovrebbe funzionare.

Per esempio, se l'equity del conto è superiore a 5 pips (per 4 caratteri) - nel mercato reale, se il numero di ordini è superiore a 3-4, si trasformeranno facilmente in meno (secondo i risultati della cancellazione). :)))

P.S. Per quanto ho capito, hai bisogno di un codice già pronto, mentre l'algoritmo per risolvere un tale problema è inutile per te!

 
TarasBY:
5 pips (per 4 segni) - nel mercato reale se il numero di ordini è maggiore di 3-4, si trasformerà facilmente (per risultati di cancellazione) in meno. :)))


Io per primo... e ho prestato attenzione all'oro ultimamente... non reagisce così velocemente come pensavo

Non ho ancora lavorato con funzioni come questa ... ecco perché sto chiedendo supporto

 
Buon pomeriggio, ho un problema con lo sviluppo dell'Expert Advisor, non chiude gli ordini, anche se le condizioni prescritte per la chiusura da un indicatore, si prega di spiegare che cosa è, grazie in anticipo
File:
 
sannin:


Beh, io per primo... e ho prestato attenzione all'oro ultimamente... non è così veloce come pensavo

Non ho ancora lavorato con le funzioni in questo modulo ... quindi ecco una richiesta di supporto

In primo luogo, si calcola la linea BU di una posizione aggregata per lo strumento (viene utilizzata per determinare le condizioni di chiusura degli ordini quando raggiungono la redditività in pip):

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Определение Уровня БезУбытка по символу                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_BreakEven (string fs_Symbol,     // Symbol
                       double fd_DeltaLots,  // разность объемов ордеров Buy и Sell
                       double fd_Profit)     // текущий профит по открытым ордера
{
    if (fd_DeltaLots == 0.) return (0.);
    double ld_BU = 0., ld_tickvalue = MarketInfo (fs_Symbol, MODE_TICKVALUE);   // цена одного пункта
//----
    //---- Уровень общего безубытка для открытых ордеров
    if (fd_DeltaLots > 0.) ld_BU = MarketInfo (fs_Symbol, MODE_BID) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
    else if (fd_DeltaLots < 0.) ld_BU = MarketInfo (fs_Symbol, MODE_ASK) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
//----
    return (ld_BU);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Poi si calcola la differenza tra il prezzo attuale e la linea di Breakeven. Se la "differenza" è soddisfacente, si procede alla procedura di cancellazione degli ordini. La prima cosa da fare è trovare il biglietto dell'ordine più redditizio/perdente:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Получаем Тикет самого прибыльного/убыточного ордера                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TicketWithControlProfit (string fs_Symbol = "",  // Инструмент
                                  int fi_Magic = -1,      // Magic
                                  int fi_Type = -1,       // OrderType
                                  int fi_TypeProfit = 0)  // Профитность ордера среди остальных ордеров:
                                                          // >= 0 -  с самым большим профитом;
                                                          // < 0 - самый убыточный
{
    double ld_Profit = 0., ld_curProfit;
    int    li_Total = OrdersTotal(), li_Ticket = -1;
//----
    if (fs_Symbol == "") fs_Symbol = Symbol();
    if (fi_TypeProfit < 0) ld_Profit = 10000000000.;
    for (int i = li_Total - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != fs_Symbol) continue;
        if (fi_Magic > -1) if (OrderMagicNumber() != fi_Magic) continue;
        if (fi_Type > -1) if (OrderType() != fi_Type) continue;
        if (fi_Type > 1) continue;
        ld_curProfit = OrderProfit() + OrderSwap() + OrderCommission();
        if (fi_TypeProfit >= 0) {if (ld_Profit <= ld_curProfit) continue;}
        else if (ld_Profit >= ld_curProfit) continue;
        ld_Profit = ld_curProfit;
        li_Ticket = OrderTicket();
    }
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

La cancellazione può essere fatta in entrambe le direzioni. Cancelliamo:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция закрытия "своих" ордеров по признаку                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fClose_AllOrdersByProfit (string fs_Symbol = "",  // Инструмент
                              int fi_Magic = -1,      // Magic
                              int fi_Type = -1,       // OrderType
                              int fi_TypeProfit = 0)  // Направление закрытия ордеро по профитности:
                                                      // >= 0 - начиная от самого большого профита;
                                                      // < 0 - начиная от самого маленького профита;
{
    int li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit),
        li_cnt = 0;
//----
    while (li_Ticket > 0)
    {
         //---- Здесь вставите свою процедуру закрытия 
         //---- что-то типа:
         //ClosePosByTicket (li_Ticket);
         li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit);
         li_cnt++;
    }
//----
    return (li_cnt);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Montare ulteriormente l'unità desiderata non è troppo difficile: dovrai farlo o andare al lavoro... :)

 
Voglio assegnare un valore di prezzo a una variabile.

a=(NormalizeDouble(OrderOpenPrice(),5));


Ma per qualche ragione, il prezzo è disegnato con un valore a quattro cifre a 1,3360

Potrebbe dirmi l'errore?
 
lottamer:
Voglio assegnare un valore di prezzo a una variabile.



Ma per qualche ragione, il prezzo è disegnato con un valore a quattro cifre a 1,3360

Puoi dirmi l'errore?

Forse il DC è a quattro cifre? Oppure emettere il prezzo senza DoubleToStr(YourPrice,5)
 
Sepulca:

Forse il DC è a quattro cifre? O visualizzare il prezzo senza DoubleToStr(YourPrice,5)


Il DC è a cinque cifre...

Cosa significa SENZA DoubleToStr(YourPrice,5)? Non ho DoubleToStr(YourPrice,5) da nessuna parte