Non hai un ordine selezionato nella funzione Trade ().
A proposito. Che senso ha selezionare un ordine nella funzione Trade()? Sto chiamando la funzioneOrdersModifying() dove l'ordine è selezionato e viene modificato lì. Cioè, la variante iniziale era corretta!
History, History_Draw - funzionano come Expert Advisors durante i test.
Avete bisogno di qualcosa come questo per guardare le correzioni nella storia in base a determinati parametri
Nella storia o nel grafico? Vuoi vedere i risultati in una finestra del grafico, in una finestra separata, stampati in una tabella, e se sì, che tipo di dati, sotto forma di candele di colore diverso, come linee che collegano l'inizio e la fine del movimento?
OrderSelect(g_ticket,SELECT_BY_TICKET) prima della linea if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
Questo è quello che ho fatto:
bool Trade (int signal)
{
int total = OrdersTotal() - 1;
FindOrders();
if(signal == SIGNAL_BUY) // Если сигнал на покупку и открытых ордеров нет..if(!OpenBuy()) // открываем лимитный ордер на покупкуreturn(false);
if(signal == SIGNAL_SELL) // Если сигнал на продажу и открытых ордеров нет..if(!OpenSell())
return(false); // открываем лимитный ордер на продажуif(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
{
if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
OrdersModifying(); // Модифицируем ордер, добавим SL и TP
}
// if(UseBU == true)// MovingStopLossToBU(); // Перевод в б.у. по достижению некоторого значения TPreturn(true);
}
Non ci sono fermate e acquisizioni. Il log dice errore 130, dicendo che gli arresti sono sbagliati. Non ne vedo la ragione.
Ma la seconda funzione produce una stringa ID "EURUSD" (beh, dipende dal grafico, ma produce, anche se secondo la logica della funzione dovrebbe essere una stringa vuota):
Aiutatemi a capire cosa c'è che non va? Grazie
Non potete usare nomi riservati (valore) quando dichiarate le vostre variabili, chiamate _value
Vitaly, ho fatto come hai detto tu, ma non è cambiato nulla. A quanto pare il bug è sepolto da qualche altra parte.
Prima avevo tutto (ordini di apertura - modifica e trasferimento a b.w. quando il livello di prezzo impostato viene raggiunto) e tutto funzionava. Era così:
bool Trade (int signal)
{
FindOrders();
double sl = 0, tp = 0;
if(signal == SIGNAL_BUY) // Если сигнал на покупку и открытых ордеров нет...if(!OpenBuy()) // открываем лимитный ордер на покупкуreturn(false);
if(signal == SIGNAL_SELL) // Если сигнал на продажу и открытых ордеров нет..if(!OpenSell()) // Открываем лимитный ордер на продажуreturn(false);
int total = OrdersTotal() - 1;
for(int i=total; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true) // Если ордер есть и он выбран..
{
if(g_type == OP_BUY)
{
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
if(g_type == OP_SELL)
{
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
if(sl != 0 || tp != 0) // Если полученные значения sl и tp не равныы 0, то..
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Модифицируем ордер
}
}
}
return(true);
}
Ora, dato che ho suddiviso tutto in funzioni specializzate specifiche, tutto ha smesso di funzionare così tanto. Ho provato in entrambi i modi, ma non funziona niente, non ci sono fermate.
double sl = 0, tp = 0; // тут присвоили по нулямfor(int i=total; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true) // Если ордер есть и он выбран..
{
if(g_type == OP_BUY)
{
if(i_sl != 0) // замените на if(sl == 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits); // Если по нулям, тогда выполнится условие!
Dov'è la logica in questo? Vorrei capire... Ecco la funzione:
void OrdersModifying()
{
int total = OrdersTotal() - 1;
double sl = 0, tp = 0;
for(int i=total; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true) // Если ордер есть и он выбран..
{
if(g_type == OP_BUY)
{
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
if(g_type == OP_SELL)
{
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
if(sl != 0 || tp != 0) // Если полученные значения sl и tp не равныы 0, то..
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Модифицируем ордер
}
}
}
}
Se le variabili di input i_sl e i_tp non sono uguali a zero, otteniamo i prezzi di stop e take che saranno già nell'ordine - sl etp. Dopo di che controllerò se abbiamo calcolatosl etp qui (se per gli short):
if(i_sl != 0) // Если входной параметр стоп-лосса не равен 0, то..
sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Получаем значение стоп-лосса для выбранного ордераif(i_tp != 0) // Если входной параметр тейкпрофита не равен 0, то..
tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Получаем значение тейкпрофита для выбранного ордера
}
Se i valori sono ottenuti, allora non possono essere zero... perché saranno cambiati! Queste sono variabili che otteniamo in modo sequenziale in base al contesto del codice.
E qui, ho controllato se abbiamo trovato i valori di stop e take. Come possono essere zero dopo tutte le condizioni?
if(sl != 0 || tp != 0) // Если полученные значения sl и tp не равныы 0, то..
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Модифицируем ордер
}
Non hai un ordine selezionato nella funzione Trade ().
A proposito. Che senso ha selezionare un ordine nella funzione Trade()? Sto chiamando la funzione OrdersModifying() dove l'ordine è selezionato e viene modificato lì. Cioè, la variante iniziale era corretta!
Esiste una cosa del genere. Ecco la soluzione.
E la funzione di modifica è qui:
Strano Ma non ci sono fermate e prese sull'uscita di nuovo.
OrderSelect(g_ticket,SELECT_BY_TICKET) prima della linea if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
History, History_Draw - funzionano come Expert Advisors durante i test.
Avete bisogno di qualcosa come questo per guardare le correzioni nella storia in base a determinati parametri
Nella storia o nel grafico? Vuoi vedere i risultati in una finestra del grafico, in una finestra separata, stampati in una tabella, e se sì, che tipo di dati, sotto forma di candele di colore diverso, come linee che collegano l'inizio e la fine del movimento?
OrderSelect(g_ticket,SELECT_BY_TICKET) prima della linea if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
Questo è quello che ho fatto:
Non ci sono fermate e acquisizioni. Il log dice errore 130, dicendo che gli arresti sono sbagliati. Non ne vedo la ragione.
Questo è quello che ho fatto:
Non ci sono fermate e acquisizioni. Il log dice errore 130, dicendo che gli arresti sono sbagliati. Non ne vedo la ragione.
Senza if, soloOrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);, e potete lasciarlo in OrdersModifying()
//+------------------------------------------------------------------+
void OrdiniModifica()
{
OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);
se(g_type == OP_BUY)
{
if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // Se il parametro di ingresso stop loss non è 0
// Ottieni il valore di Stop Loss per l'ordine selezionato
if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // Se il parametro di input TakeProfit non è uguale a 0, allora...
// ottenere il valore di TakeProfit per l'ordine selezionato
}
se(g_type == OP_SELL)
{
if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Se il parametro di ingresso dello stop loss non è 0
// Ottieni il valore di Stop Loss per l'ordine selezionato
if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Se il parametro di input TakeProfit non è uguale a 0, allora...
// ottenere il valore di TakeProfit per l'ordine selezionato
}
if(sl != 0 || tp != 0) // Se i valori ottenuti di sl e tp non sono uguali a 0, allora..
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Modifica ordine
}
}
Problema con Symbol() MT4:
2 funzioni da illustrare:
L'esecuzione del primo produce una stringa vuota:
Ma la seconda funzione produce una stringa ID "EURUSD" (beh, dipende dal grafico, ma produce, anche se secondo la logica della funzione dovrebbe essere una stringa vuota):
Aiutatemi a capire cosa c'è che non va? Grazie
Non potete usare nomi riservati (valore) quando dichiarate le vostre variabili, chiamate _value
Questo è quello che ho fatto:
Non ci sono fermate e acquisizioni. Il log dice errore 130, dicendo che gli arresti sono sbagliati. Non ne vedo la ragione.
E non lo faranno!
Vitaly, ho fatto come hai detto tu, ma non è cambiato nulla. A quanto pare il bug è sepolto da qualche altra parte.
Prima avevo tutto (ordini di apertura - modifica e trasferimento a b.w. quando il livello di prezzo impostato viene raggiunto) e tutto funzionava. Era così:
Ora, dato che ho suddiviso tutto in funzioni specializzate specifiche, tutto ha smesso di funzionare così tanto. Ho provato in entrambi i modi, ma non funziona niente, non ci sono fermate.
E non lo faranno!
Dov'è la logica in questo? Vorrei capire... Ecco la funzione:
Se le variabili di input i_sl e i_tp non sono uguali a zero, otteniamo i prezzi di stop e take che saranno già nell'ordine - sl etp. Dopo di che controllerò se abbiamo calcolatosl etp qui (se per gli short):
Se i valori sono ottenuti, allora non possono essere zero... perché saranno cambiati! Queste sono variabili che otteniamo in modo sequenziale in base al contesto del codice.
E qui, ho controllato se abbiamo trovato i valori di stop e take. Come possono essere zero dopo tutte le condizioni?
Prima costruisci la tua logica all'inizio, poi fai funzioni, file, ecc.
Perché grattarsi la mano sinistra dietro l'orecchio destro!