Per favore controllate dove ho fatto un errore (non vuole funzionare)
Voglio che il segnale di acquisto sia spostato delladeviazione * _Point (impostato nelle impostazioni)if(GetLotSize()>LotControl)
LotControl - anche impostato nelle impostazioni
GetLotSize() - come raccomandato:
double GetLotSize()
{
double Ls=0;
datetime last = 0, openTime;
for (int pos=OrdersTotal()-1;pos>=0;pos--)
{
if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
if ((openTime = OrderOpenTime()) > last) {
last = openTime;
Ls = OrderLots();
}
}
}
}
}
return Ls;
}
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров, то входим в условиеif(CountOrders()==0)
{
if(GetLotSize()>LotControl) {openPrice = dMA + deviation * _Point;}
else
openPrice = dMA;
//Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit// if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)// {// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка// CloseOrder();// }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
//+-----------------------------------------------------------------------------------------------+//| Функция проверки открытых оредров |//+-----------------------------------------------------------------------------------------------+int CountOrders()
{
int cnt=0;
int i=OrdersTotal()-1;
for(int pos=i;pos>=0;pos--)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==_Symbol)
{
if(OrderMagicNumber()==Magic) cnt++;
}
}
}
return(cnt);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на покупку |//+-----------------------------------------------------------------------------------------------+bool bSignalBuy()
{
if (openPrice > Open[1] && openPrice < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на продажу |//+-----------------------------------------------------------------------------------------------+bool bSignalSell()
{
if(openPrice< Open[1] && openPrice > Close[1])
return(true);
return(false);
}
Grazie. Non ha avuto alcun effetto per qualche motivo.
Ho scritto:
if (bSignalBuy()) {
if (GetLotSize() > LotControl)
vOrderOpenSell();
else
vOrderOpenBuy();
}
Ma apre ancora due posizioni diversamente dirette sullo stesso tick? Non può essere giusto!
double GetLotSize()
{
double Ls=0;
datetime last = 0, openTime;
for (int pos=OrdersTotal()-1;pos>=0;pos--)
{
if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
if ((openTime = OrderOpenTime()) > last) {
last = openTime;
Ls = OrderLots();
}
}
}
}
}
return Ls;
}
Riguardo a questo codice, è possibile che non sia cambiato nulla. Poiché gli ordini vengono eseguiti nell'ordine di chiusura.
Risolvi il tuo algoritmo nel miglior modo possibile.
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров, то входим в условиеif(CountOrders()==0)
{
if(GetLotSize()>LotControl) {openPrice = dMA + deviation * _Point;}
else
openPrice = dMA;
//Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit// if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)// {// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка// CloseOrder();// }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
Dovresti controllare il tuo algoritmo: qui stai entrando con i segnali di acquisto e vendita e niente di più. Cosa potrebbe non funzionare qui? Nessuna funzione di entrata o uscita...
Cosa c'è qui dentro? Non avete cambiato nulla nella sostanza. Hai appena fatto altre chiamate a OrderCloseTime. Il codice è stato allungato in una sola riga. Ed è diventato meno leggibile. Ma il risultato è sempre lo stesso.
E qui? Non hai cambiato nulla in sostanza. Hai appena fatto altre chiamate a OrderCloseTime. E abbiamo allungato il codice in una sola riga. Ed è diventato meno leggibile. Ma il risultato è lo stesso.
Per quanto posso vedere, la differenza sta nel seguente:
double GetLotSize()
{
double Ls=0;
datetime last = 0, openTime;
for (int pos=OrdersTotal()-1;pos>=0;pos--)
{
if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
if ((openTime = OrderOpenTime()) > last) {
last = openTime;
Ls = OrderLots();
}
}
}
}
}
return Ls;
}
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Ciao!
Per favore controllate dove ho fatto un errore (non vuole funzionare)
Voglio che il segnale di acquisto sia spostato delladeviazione * _Point (impostato nelle impostazioni)if(GetLotSize()>LotControl)
LotControl - anche impostato nelle impostazioni
GetLotSize() - come raccomandato:
Grazie, non ha avuto alcun effetto per qualche motivo.
Grazie. Non ha avuto alcun effetto per qualche motivo.
Ho scritto:
Ma apre ancora due posizioni diversamente dirette sullo stesso tick? Non può essere giusto!
Riguardo a questo codice, è possibile che non sia cambiato nulla. Poiché gli ordini vengono eseguiti nell'ordine di chiusura.
Risolvi il tuo algoritmo nel miglior modo possibile.
Dovresti controllare il tuo algoritmo: qui stai entrando con i segnali di acquisto e vendita e niente di più. Cosa potrebbe non funzionare qui? Nessuna funzione di entrata o uscita...
Forum sul trading, sistemi di trading automatico e test di strategia
Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici
MakarFX, 2021.12.02 18:30
Cosa c'è qui dentro? Non avete cambiato nulla nella sostanza. Hai appena fatto altre chiamate a OrderCloseTime. Il codice è stato allungato in una sola riga. Ed è diventato meno leggibile. Ma il risultato è sempre lo stesso.
E qui? Non hai cambiato nulla in sostanza. Hai appena fatto altre chiamate a OrderCloseTime. Ma il risultato è lo stesso.
apri gli occhi
Discussioni in studio, per favore
Discussioni in studio, per favore.
Ora apri gli occhi
E qui? Non hai cambiato nulla in sostanza. Hai appena fatto altre chiamate a OrderCloseTime. E abbiamo allungato il codice in una sola riga. Ed è diventato meno leggibile. Ma il risultato è lo stesso.
Per quanto posso vedere, la differenza sta nel seguente:
Ora apri gli occhi.
(Ok. Ho perso quel momento. Lo ammetto.
Per quanto posso vedere, la differenza è la seguente: