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!
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();
}
}
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
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, // Symboldouble fd_DeltaLots, // разность объемов ордеров Buy и Selldouble 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);
elseif (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, // Magicint fi_Type = -1, // OrderTypeint 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;}
elseif (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, // Magicint fi_Type = -1, // OrderTypeint 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... :)
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
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!
//-------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------
Prova così:
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.
}
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!
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
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):
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:
La cancellazione può essere fatta in entrambe le direzioni. Cancelliamo:
Montare ulteriormente l'unità desiderata non è troppo difficile: dovrai farlo o andare al lavoro... :)
Ma per qualche ragione, il prezzo è disegnato con un valore a quattro cifre a 1,3360
Potrebbe dirmi l'errore?
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)
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