Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 110
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Per favore aiutatemi a scrivere una funzione che calcoli il numero di ordini e il loro profitto totale chiuso negli ultimi 60 secondi sulla coppia corrente. Non riesco a formularlo correttamente.
double ClosingSellProfit=0, ClosingBuyProfit;
for(int i=0; i<OrdersHistoryTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
{
}
}
Credo che lei possa capirlo:
double GetProfitOldClosePos(string symb="", int type=-1, int mg=-1) {
if(symb=="0") symb=Symbol();
datetime gt=0,ct=0;
double pr=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if(OrderSymbol()==symb &&(type<0||OrderType()==type)&& OrderMagicNumber()==mg) {
ct=OrderCloseTime();
// 120 секунд разницы между закрытием первой и последней в сетке
if((gt<=ct && ct<=gt+120) || gt==0) {
gt=ct;
pr+=OrderProfit()+OrderCommission()+OrderSwap();
}}}}
return(pr);
}
Per favore aiutatemi a scrivere una funzione che calcoli il numero di ordini e il loro profitto totale chiuso negli ultimi 60 secondi sulla coppia corrente. Non riesco a trovarlo sulla lingua, non riesco a formularlo correttamente.
double ClosingSellProfit=0, ClosingBuyProfit;
for(int i=0; i<OrdersHistoryTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
{
if(OrderType()==OP_SELL)
{
if(. . .)
{
CountClosedSellOrders++;
ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
}
if(OrderType()==OP_BUY)
{
if(. . .)
{
CountClosedBuyOrders++;
ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
double ClosingSellProfit=0,ClosingBuyProfit;
//for(int i=0; i<OrdersHistoryTotal(); i++)
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
{
if(OrderCloseTime()>=TimeCurrent()-60)
{
if(OrderType()==OP_SELL)
{
CountClosedSellOrders++;
ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
}
if(OrderType()==OP_BUY)
{
CountClosedBuyOrders++;
ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
Come posso specificare un trailing stop quando apro un ordine?
Se il prezzo è zero o non è impostato , imposta la coordinata della linea al prezzo dell'ultimo ordine. Questo va bene.
Anche il registro è normale, prosciuga l'account come dovrebbe essere. Non guardo gli errori di deposito insufficiente.
Ma la linea è ancora rossa. Cioè chiamiamo la linea di acquisto, è così com'è, passiamo i parametri ma ne vengono passati altri.
Questa condizione non dovrebbe assolutamente essere scritta come nel vostro codice. Ti crei le tue difficoltà per superarle "eroicamente" ))))
Tutto ciò che crea la linea rossa nel codice è commentato, quindi è creato da qualcun altro. Oppure è rimasto appeso al grafico da quando quella parte del codice era in lavorazione.
Raccomando la stessa cosa che ho raccomandato molte volte in precedenza - stampare tutte le azioni e i codici di ritorno (errori) nel log, risponderà a molte domande.
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Ma il principio di base per la maggior parte degli indicatori è questo:
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(rates_total<1) return(0); // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то проверять нужно это количество, а не 1
//--- Действия для полного перерасчёта индикатора
int limit=rates_total-prev_calculated; // количество посчитанных уже баров
if(limit>1) { // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
limit=rates_total-1; // задаём количество требуемых для расчёта баров равным количеству баров в истории,
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
// так же тут нужно при необходимости произвести инициализацию буферов индикатора
}
//--- Основной цикл индикатора
for(int i=limit; i>=0; i--) {
// тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0; // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Questa condizione non dovrebbe certamente essere scritta come nel vostro codice. Ti crei le tue difficoltà per superarle "eroicamente" ))))
Tutto ciò che crea la linea rossa nel codice è commentato, quindi è creato da qualcun altro. Oppure è rimasto appeso al grafico da quando quella parte del codice era in lavorazione.
Raccomando la stessa cosa che ho raccomandato molte volte in precedenza - stampare tutte le azioni e i codici di ritorno (errori) nel log, questo risponderà a molte domande.
200 linea mistica
:)
Non hai un modello completo - probabilmente non hai impostato i buffer degli indicatori nella procedura guidata, dove verranno scritti i dati calcolati.
Ma il principio di base per la maggior parte degli indicatori è questo:
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(rates_total<1) return(0); // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то проверять нужно это количество, а не 1
//--- Действия для полного перерасчёта индикатора
int limit=rates_total-prev_calculated; // количество посчитанных уже баров
if(limit>1) { // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
limit=rates_total-1; // задаём количество требуемых для расчёта баров равным количеству баров в истории,
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
// так же тут нужно при необходимости произвести инициализацию буферов индикатора
}
//--- Основной цикл индикатора
for(int i=limit; i>=0; i--) {
// тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0; // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Per favore, aiutatemi!
C'è una stringa ABCDEF come dividerla in 3 stringhe (salvare in una stringa variabile):
AB
CD
EF
Per favore, aiutatemi!
C'è una stringa ABCDEF come dividerla in 3 stringhe (salvare in una stringa variabile):
AB
CD
EF
string string_value, // строка
int start_pos, // с какой позиции начать
int length=0 // длина извлекаемой строки
);