Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 32
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
Ecco, questo è diverso, ora è chiaro a cosa si riferisce l'1% ;)
L'Expert Advisor considera i valori minimi e massimi delle ultime X barre e piazza gli ordini in base ad essi. Poi, quando il massimo o il minimo è diminuito, si dovrebbe cancellare l'ordine corrispondente e aprire con nuovi dati.
Non ha capito esattamente quando si modificano le pause, ma ha fatto in modo che se il prezzo minimo è superiore al prezzo di impostazione BuyLimit esistente, allora è necessario modificarlo al nuovo prezzo Min.
Per SellLimit - speculare.
Ho solo scritto il codice, ma non l'ho controllato affatto - lascio a voi il compito di modificare e controllare la correttezza dell'algoritmo e del codice in generale.
input double LotB=0.1; // Лот Buy
input double LotS=0.1; // Лот Sell
input int Pointsl=100; // StopLoss в пунктах
input int Pointtp=100; // TakeProfit в пунктах
input int NumBars=10; // Количество баров для поиска Max/Min
input int Magic=100500; // Magic
//--- global variables
struct DataPendingOrder
{
int number; // Количество
double price_set; // Цена установки
};
struct DataPending
{
DataPendingOrder buy_limit; // BuyLimit
DataPendingOrder buy_stop; // BuyStop
DataPendingOrder sell_limit; // SellLimit
DataPendingOrder sell_stop; // SellStop
};
struct DataOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
DataPending order; // Данные отложенного ордера
};
DataOrders getData; // Данные ордеров и позиций
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
pointsl=(Pointsl<0?0:Pointsl);
pointtp=(Pointtp<0?0:Pointtp);
double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders(Symbol(),Magic,getData);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice=0.0, minPrice=DBL_MAX;
for(int i=0; i<numBars; i++) {
double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
if(max_i>maxPrice) maxPrice=max_i;
double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
if(min_i<minPrice) minPrice=min_i;
}
//--- если нету рыночных Buy
if(getData.buy==0) {
//--- если нет отложенного BuyLimit
if(getData.order.buy_limit.number==0) {
double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
ResetLastError();
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError());
else Print("OP_BUYLIMIT OK");
}
//--- если есть BuyLimit
else {
//--- если цена Min больше цены установки BuyLimit
if(minPrice>getData.order.buy_limit.price_set) {
// модифицировать BuyLimit - поставить его на цену minPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//--- если нету рыночных Sell
if(getData.sell==0) {
//--- если нет отложенного SellLimit
if(getData.order.sell_limit.number==0) {
double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
ResetLastError();
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError());
else Print("OP_SELLLIMIT OK");
}
//--- если есть SellLimit
else {
//--- если цена Max меньше цены установки SellLimit
if(maxPrice<getData.order.sell_limit.price_set) {
// модифицировать SellLimit - поставить его на цену maxPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//---
string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataOrders &data_of) {
ZeroMemory(data_of);
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
//--- рыночные позиции
if(OrderType()==OP_BUY) data_of.buy++;
if(OrderType()==OP_SELL) data_of.sell++;
//--- отложенные ордера
if(OrderType()==OP_BUYLIMIT) { data_of.order.buy_limit.number++; data_of.order.buy_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_BUYSTOP) { data_of.order.buy_stop.number++; data_of.order.buy_stop.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLLIMIT) { data_of.order.sell_limit.number++; data_of.order.sell_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLSTOP) { data_of.order.sell_stop.number++; data_of.order.sell_stop.price_set=OrderOpenPrice(); }
}
}
}
//+------------------------------------------------------------------+
Spero che lo capirete
Perché cancellare quando si può modificare il prezzo di impostazione e lo stop e il takeout relativi al nuovo livello?
Ho appena iniziato a studiare e l'opzione di cancellazione era per studiare l'applicazione della funzione, mi chiedevo perché non funzionasse.
Grazie a tutti per il vostro feedback.
Qualcuno vuole sapere come dovrebbe essere il comando extern reset?
come dovrebbe apparire
1) Selezionare una serie di condizioni richieste dalla lista per il comando da attivare, ad esempio, aprire un ordine
2) L'ordine è aperto e il comando non funziona in altre condizioni. Il filtraggio per biglietto e quantità d'ordine non è un'opzione poiché il principio stesso dovrebbe essere distribuito in tutta la lista.
se (MA1>GrossaMA1 && MA2<GrossaMA2 && Bid>MA1+Distanse*Point() ) Qual è l'errore qui se GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] usano l'intersezione mobile + filtro per distanza dopo l'intersezione mobile. Quanto è accurata questa condizione?
Quello cheGrossMA1 eGrossMA2 vi restituiscono, molto probabilmente c'è una differenza, vi ritroverete con qualcosa del genere
MA1= 1,0050
if (MA1 > 0.0052) // non è il prezzo stesso ma la sua differenza, quindi non è un confronto errato
Quello cheGrossMA1 eGrossMA2 ti restituiscono, probabilmente c'è una differenza, ti ritrovi con qualcosa come questo
MA1= 1,0050
if (MA1 > 0.0052) // cioè non il prezzo stesso, ma la sua differenza, quindi è un confronto errato
Quello cheGrossMA1 eGrossMA2 vi restituiscono, c'è molto probabilmente una differenza, vi ritroverete con qualcosa come questo
MA1= 1,0050
if (MA1 > 0.0052) // cioè non il prezzo stesso, ma la sua differenza, quindi è un confronto errato
FRMA2=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1);
FMA1=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0);
FMA2=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1);
GrossMA1=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0);
GrossMA2=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1);
Quello cheGrossMA1 eGrossMA2 ti restituiscono, probabilmente c'è una differenza, ti ritrovi con qualcosa come questo
MA1= 1,0050
if (MA1 > 0.0052) // cioè non il prezzo stesso, ma la sua differenza, quindi è un confronto errato
Bene. Puoi dirmi dov'è l'errore?
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10; extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Tutto funziona, fa un ordine al prezzo di maxpr1.
Poi voglio fare lo stesso, ma al prezzo minpr1:
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Errore 130 (fermate sbagliate). Cosa sto facendo di sbagliato?