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
Intendete aprire le transazioni all'apertura di una candela D1? Se è così, specificate nella logica dell'Expert Advisor le condizioni per aprire le transazioni solo in un determinato momento.
Capisco. E un'altra domanda: ho impostato due ordini pendenti a +15 pip dal prezzo: buystop e sellstop. E ad ogni tick li sposto ad un nuovo prezzo. Non appena il prezzo li tocca durante forti movimenti di prezzo (il più delle volte durante eventi di notizie) il terminale si blocca. (Perché si blocca?
Non posso dire perché si blocca, non sono un sensitivo, occupatevi del codice dell'Expert Advisor. Posso supporre che dopo che l'ordine è stato eseguito, il tuo EA cerca di spostarlo a un nuovo prezzo, ma poiché l'ordine pendente è già sul mercato, il tuo EA si blocca. Prova a visualizzare nel log lo stato delle variabili chiave dell'Expert Advisor per analizzare la sua logica di funzionamento.
Non posso dire perché si blocca, non sono un sensitivo, occupatevi del codice dell'Expert Advisor. Posso supporre che dopo che l'ordine è stato eseguito, il tuo EA cerca di spostarlo a un nuovo prezzo, ma poiché l'ordine pendente è già sul mercato, il tuo EA si blocca. Prova a visualizzare nel log lo stato delle variabili chiave dell'EA per analizzare la logica del suo lavoro.
Penso di aver impostato tutte le condizioni correttamente:
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
Non tieni conto che il limite di acquisto può essere impostato solo sotto il prezzo e il limite di vendita sopra il prezzo. Per quello che suggerisci è necessario utilizzare gli ordini di stop.
Sono d'accordo, grazie per aver capito il mio algoritmo confuso. Sono ancora confuso sui nomi dei ciondoli...
Che si fermino, forse dovremmo provare a costruire un EA?
Lo testerò più tardi e mostrerò cosa succede?
... O dammi un link, non è che ho scoperto l'America?
Penso di aver impostato correttamente tutte le condizioni di prova:
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
Temo di non poterti aiutare perché il tuo codice non si presta all'analisi. Forse potete aggiungere qualche commento per migliorare la vostra comprensione. Non è chiaro a cosa serva l'array ord[] e quali dati memorizzi. Ho capito il tuo codice in questo modo: ogni tick scrivi il tipo di ordine nell'array (Uchet_Orderov_Function(Symbol(),Magic,ord);) poi controlla la condizione if(ord[7]==2 && ord[6]==0 && Volume[0]==1) e se è vero, gli ordini pendenti saranno cancellati e tutte le posizioni saranno chiuse. Poi controlliamo la condizione se (ord[6]==0 && ord[7]==0 && Volume[0]==1) e se è vero, vengono aperti due ordini pendenti. Ma il valore dell'array ord[] non sarà aggiornato prima di verificare la condizione se (ord[6]==0 && ord[7]==0 && Volume[0]==1). E sarà aggiornato solo al secondo tick.
Quindi è necessario registrare tutti i valori dell'array ord[] che influenzano la sua logica.
Notate anche questo frammento di codice:
Credo che manchino delle parentesi software { . Dovrebbe essere così:
Notate anche questo pezzo di codice:
Credo che manchino le parentesi { . Dovrebbe essere così:
In questo caso, le parentesi non influiscono sul funzionamento (logica). Non c'è nessun errore
In questo caso, le parentesi non hanno alcun effetto sul funzionamento (logica). Non c'è nessun errore.
Sono d'accordo, grazie per aver capito il mio algoritmo confuso. Sono ancora confuso sui nomi dei ciondoli...
Che si fermino, forse dovremmo provare a costruire un EA?
Lo testerò più tardi e mostrerò cosa succede?
... O dammi un link a uno, non è che ho scoperto l'America?
Bisogna avere almeno delle conoscenze di base per suggerire qualcosa. Tutte le idee semplici sono state provate da molto tempo e infatti non avete scoperto l'America. Ma è probabile che nessuno cerchi un link per te sui forum e su kodobase. Se ne hai bisogno, lo cerchi. O pensi che ci siano persone che tengono nella loro mente link a tutti i tipi di Expert Advisors, script e indicatori?
(Ho un'idea, ho bisogno di aiuto)) Scrivere un Expert Advisor per questo
Lo sto usando per il trading da molto tempo. Ottengo 1000 pips mensili su una coppia di valute. Nonsono mai stato abituato a fare trading sul mio forex, e non sono mai stato abituato a comprare coppie. Non c'è praticamente nessun drawdown, massimo 5 pips.
Timeframe H4
1. MA4/semplicemente chiuso
2. MA5/semplice/aperto
Il principio di funzionamento dovrebbe essere cosìSenza Take Profit e Stop Loss. Aprire e chiudere operazioni solo sui crossover. Per esempio, incrociare dal basso verso l'alto, aprire un ordine in alto, chiudere l'ordine solo quando è incrociato indietro. Se c'è un segnale inverso per chiudere l'ordine di acquisto aprire l'ordine di vendita. In generale, spero che tu capisca) nella strategia non è nemmeno il profitto che conta, ma questi crossover cazzo) Qualcosa come questo) Commercio su questa strategia per un lungo periodo, il profitto è buono, ma dal momento che penso di scrivere questa strategia esperto consulente non sarà difficile.
Se siete d'accordo ad aiutare, ecco il mio MAIL: 4iterRrock@mail.ru
Qui sotto c'è il mio modello che ho scambiato per quasi un anno.