[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 280
Come prima esperienza ho deciso di implementare il seguente algoritmo: possiamo aspettarci che dopo che le linee di Bollinger si avvicinano troppo l'una all'altra in un corridoio stretto, il mercato si muoverà velocemente in alto o in basso in qualche tempo. Nel mio Expert Advisor, analizzo lo stato delle linee di Bollinger e quando queste si avvicinano molto(Delta pips), mettiamo un ordine di vendita pendente nella direzione inferiore (a stepOpen pips sotto la linea inferiore), sperando che il mercato vada improvvisamente in quella direzione. Se il mercato va in un'altra direzione, cancelliamo semplicemente questo ordine.
externdouble Delta=800.0; // Ширина канала, которую мы считаем достаточно узкой чтобы ожидать скоро серьезного движения в одну из сторонexterndouble StepOpen=150.0; // Отступ от линии Боллинджера для открытия отложенного ордераexterndouble TP=350.0; // Take Profitexterndouble SL=400.0; // Stop Lossint start()
{
double T1=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,0); // верхняя линия Боллинджераdouble T2=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,0); // нижняя линия Боллинджераif ((Ask>T1+StepOpen*Point)&&OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true) OrderDelete(0); // если рынок пошел вверх – то удаляем отложенный ордерif (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true) return(0); // если есть ранее открытый ордер – прекращаем выполнение текущей итерации советникаif (T1-T2<Delta*Point) { // если линии Боллинджера сблизились ближе чем на Delta пунктов начинаем операцию открытия ордераdouble PriceOpen=NormalizeDouble(T2-StepOpen*Point,5); // вычисляем цену открытияdouble StopLoss=NormalizeDouble(T2-StepOpen*Point+SL*Point,5); // вычисляем StopLossdouble TakeProfit=NormalizeDouble(T2-StepOpen*Point-TP*Point,5); // вычисляем TakeProfitOrderSend(Symbol(),OP_SELL,0.1,PriceOpen,5,StopLoss,TakeProfit,0,0,0,Green); // открываем ордер на продажу
}
return(0);
}
L'algoritmo funziona in modo instabile, a volte apre due ordini in un breve periodo di tempo, dà costantemente errori OrderSend Error 130 e OrderSend Error 138, e la rimozione degli ordini aperti nel caso in cui il mercato si muova nell'altra direzione non funziona affatto.
static datetime PrevTime=0; //penultima ora di apertura della barra
/Controlli supplementari
if (PrevTime==0) PrevTime=Time[0]; // al primo avvio la barra corrente è saltata
if (Time[0]<=PrevTime) return(0); // controlla il nuovo tempo di apertura della barra
//-il tuo codice di base
PrevTime=Time[0]; // Ricorda il tempo di apertura della barra zero
ritorno(0);
}
Se avete una configurazione di bar aperta, ecco il modello, funziona.
Potresti scrivere tu stesso questa funzione nell'EA? Nell'immagine potete vedere 3 ordini aperti su una barra. Ne ho bisogno solo di uno, non posso aggiustare il codice.
//+------------------------------------------------------------------+int start()
//+------------------------------------------------------------------+
{
//--- Разрешение на открытие позиций - каждую свечуif(candle_time != Time[0])
{
candle_time = Time[0];
new_bar_buy = true;
new_bar_sell = true;
}
if (Bars < bars_count){Print("Мало данных для работы"); return(0);}
//--- Получение значений индикатора iMA
ma10 = iMA ( Symbol(), Period(), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift);
ma20 = iMA ( Symbol(), Period(), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift);
ma11 = iMA ( Symbol(), Period(), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift+1);
ma21 = iMA ( Symbol(), Period(), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift+1);
if (Revers)
{
if(rsi>50 && rsi<70)//--- включена инверсия
{
//--- Условие для продажиif(ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && new_bar_sell)
{
sell_open=true;
new_bar_sell = false;
}
}
if(rsi>30 && rsi<50)//--- включена инверсия
{
//--- Условие для продажиif(ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && new_bar_buy)
{
buy_open=true;
new_bar_buy = false;
}
}
}
//--- выставление рыночных ордеровif(IsTradeAllowed())
{
Trade_BUY();
Trade_SELL();
}
return(0);
//+------------------------------------------------------------------+void Trade_BUY()
//+------------------------------------------------------------------+
{
for ( int i = 0; i < OrdersTotal(); i++ )
{
if ( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
{
if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != Magic)) continue; //не наш ордерif ( OrderType() == OP_BUY) // если ордер OP_BUY
{
min_level = MarketInfo( Symbol(), MODE_STOPLEVEL );
//--- проверка на работу трейлинг стопаif (trailing_stop !=0.0 && Ask > NormalizeDouble(OrderStopLoss() + (stop_loss_buy + MathMax(min_level, trailing_stop)) * Point, Digits) && OrderProfit() > 0)
{
if ( OrderModify ( OrderTicket(), OrderOpenPrice(),
NormalizeDouble (OrderStopLoss() + MathMax(min_level, trailing_stop) * Point, Digits),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("Сработал трейлинг стоп для Buy");
}
else
{
Print ("Ошибка модификации ордера #", GetLastError());
}
RefreshRates();
Sleep(3000);
} //end modify
}// end BUY
}//end OrderSelectelse
{
Print( "OrderSelect ошибка #", GetLastError() );
Sleep(3000);
RefreshRates();
return;
}
}// end for//--- Открываем ордер если есть сигналwhile (buy_open)
{
//--- нормализация лота
lot = Normalize_Lot(Lots);
//--- проверка на наличие свободной маржиif( AccountFreeMarginCheck(Symbol(),OP_BUY, lot) <= 0 || GetLastError() == 134 )
{
Print("Недостаточно свободной маржи для открытия ордера");
buy_open = false;
break;
}
min_level = MarketInfo( Symbol(), MODE_STOPLEVEL );
if ( OrderSend( Symbol(), OP_BUY, lot, NormalizeDouble(Ask, Digits), slippage,
NormalizeDouble(Bid - MathMax(stop_loss_buy, min_level) * Point, Digits),
NormalizeDouble(Bid + MathMax(take_profit_buy,min_level) * Point, Digits),
DoubleToStr(Magic, 0), Magic, 0, Blue) > 0 )
{
PlaySound("Wait.wav");
buy_open = false; // ордер открытbreak;
}
else
{
int Error = GetLastError(); // Не получилось :(switch(Error) // Преодолимые ошибки
{
case138:Alert("Ошибка: ",Error," Новые цены.");
RefreshRates();
continue;
case135:Alert("Ошибка: ",Error," Цена изменилась.");
RefreshRates();
continue;
case136:Alert("Нет цен.");
while(RefreshRates() == false)
Sleep(500);
continue;
case146:Alert("Подсистема торговли занята.");
Sleep(500);
RefreshRates();
continue;
default: Alert("Возникла ошибка ", Error," Выход из подпрограммы."); // Другие варианты ошибок
}// end switch
}// end elsebreak;
}// end while
}// end Trade_BUY//+------------------------------------------------------------------+void Trade_SELL()
//+------------------------------------------------------------------+
{
for ( int i = 0; i < OrdersTotal(); i++ )
{
if ( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
{
if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != Magic)) continue; //не наш ордерif ( OrderType() == OP_SELL) //если ордер OP_SELL
{
min_level = MarketInfo( Symbol(), MODE_STOPLEVEL );
//--- проверка на работу трейлинг стопаif (trailing_stop !=0.0 && Bid < NormalizeDouble(OrderStopLoss() - (stop_loss_sell + MathMax(min_level, trailing_stop)) * Point, Digits)&&OrderProfit() > 0)
{
if ( OrderModify ( OrderTicket(), OrderOpenPrice(),
NormalizeDouble (OrderStopLoss() - MathMax(min_level, trailing_stop) * Point, Digits),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("Сработал трейлинг стоп для Sell");
}
else
{
Print ( "Ошибка модификации ордера #", GetLastError());
}
RefreshRates();
Sleep(3000);
}
}// end BUY
}//end OrderSelectelse
{
Print( "OrderSelect ошибка #", GetLastError() );
Sleep(3000);
RefreshRates();
return;
}
}// end for//--- Открываем ордер если есть сигналwhile (sell_open)
{
//--- нормализация лота
lot = Normalize_Lot(Lots);
//--- проверка на наличие свободной маржиif( AccountFreeMarginCheck(Symbol(),OP_SELL, lot) <= 0 || GetLastError() == 134 )
{
Print("Недостаточно свободной маржи для открытия ордера");
sell_open = false;
break;
}
min_level = MarketInfo( Symbol(), MODE_STOPLEVEL );
if ( OrderSend( Symbol(), OP_SELL, lot, NormalizeDouble(Bid, Digits), slippage,
NormalizeDouble(Ask + MathMax(stop_loss_sell, min_level) * Point, Digits),
NormalizeDouble(Ask - MathMax(take_profit_sell, min_level) * Point, Digits),
DoubleToStr(Magic, 0), Magic, 0, Blue) > 0 )
{
PlaySound("Wait.wav");
sell_open = false; // ордер открытbreak;
}
else
{
int Error = GetLastError(); // Не получилось :(switch(Error) // Преодолимые ошибки
{
case138:Alert("Ошибка: ",Error," Новые цены.");
RefreshRates();
continue;
case135:Alert("Ошибка: ",Error," Цена изменилась.");
RefreshRates();
continue;
case136:Alert("Нет цен.");
while(RefreshRates() == false)
Sleep(500);
continue;
case146:Alert("Подсистема торговли занята.");
Sleep(500);
RefreshRates();
continue;
default: Alert("Возникла ошибка ", Error," Выход из подпрограммы."); // Другие варианты ошибок
}// end switch
}// end elsebreak;
}// end while
}// end Trade_SELL//+------------------------------------------------------------------+double Normalize_Lot(double lot)// Проверка на допустимое значение лота//+------------------------------------------------------------------+
{
double lot_min = MarketInfo(Symbol(), MODE_MINLOT);
double lot_max = MarketInfo(Symbol(), MODE_MAXLOT);
double lot_step = MarketInfo(Symbol(), MODE_LOTSTEP);
if ( lot <= lot_min ) lot = lot_min; // минимальныйelseif ( lot >= lot_max ) lot = lot_max; // максимальныйelse lot = MathFloor( lot / lot_step ) * lot_step ; // округление до ближайшего меньшегоreturn(lot);
}
//+------------------------------------------------------------------+int MathMax4(int i1,int i2,int i3,int i4)// Возврат максимального значения//+------------------------------------------------------------------+
{
int imax=i1;
if(i2>imax)imax=i2;
if(i3>imax)imax=i3;
if(i4>imax)imax=i4;
return(imax);
}
Buon pomeriggio, cari utenti del forum. Bisogno di aiuto nel cambiare l'EA, cioè lasciare tutto come è, ma cambiare l'azione (comprare/vendere) a (vendere/comprare), i miei test hanno mostrato che il trend rialzista è vendere, e il trend ribassista comprare. un semplice cambiamento nel codice COMPRARE su VENDERE me niente, o qualcosa perso, o .... Comunque, ho bisogno di aiuto Grazie in anticipo.
Come si calcola l'iMA?
C'è un posto dove posso trovare come viene calcolata la funzione iMA (o è classificata)?
In particolare sono interessato a MODE_LWMA.
Voglio guardare e modificare a mio piacimento, ma qualcosa googling il codice sorgente non ha ottenuto
https://docs.mql4.com/ru/indicators/iMA
Hai bisogno di una formula, così anche Google può trovarla facilmente.
https://docs.mql4.com/ru/indicators/iMA
Se hai bisogno di una formula, anche Google può trovarla facilmente.
O non capite il termine "ponderato lineare"?
Где-нибудь можно найти как вычисляется функция iMA (или она засекреченная)
Особеннно меня интересует MODE_LWMA.
Хочу посмотреть и подправить на свой вкус, но что-то нагуглить исходники не получилось
Buon pomeriggio!
Come prima esperienza ho deciso di implementare il seguente algoritmo: possiamo aspettarci che dopo che le linee di Bollinger si avvicinano troppo l'una all'altra in un corridoio stretto, il mercato si muoverà velocemente in alto o in basso in qualche tempo. Nel mio Expert Advisor, analizzo lo stato delle linee di Bollinger e quando queste si avvicinano molto(Delta pips), mettiamo un ordine di vendita pendente nella direzione inferiore (a stepOpen pips sotto la linea inferiore), sperando che il mercato vada improvvisamente in quella direzione. Se il mercato va in un'altra direzione, cancelliamo semplicemente questo ordine.
L'algoritmo funziona in modo instabile, a volte apre due ordini in un breve periodo di tempo, dà costantemente errori OrderSend Error 130 e OrderSend Error 138, e la rimozione degli ordini aperti nel caso in cui il mercato si muova nell'altra direzione non funziona affatto.Per favore, consigliateci! Grazie!
Victor Ivanovich!
Così tanto da sfogliare, perché non hai dato un link? Tu metti il codice... Per quale motivo?
//-il tuo codice di base
PrevTime=Time[0]; // Ricorda il tempo di apertura della barra zero
Se avete una configurazione di bar aperta, ecco il modello, funziona.
Potresti scrivere tu stesso questa funzione nell'EA? Nell'immagine potete vedere 3 ordini aperti su una barra. Ne ho bisogno solo di uno, non posso aggiustare il codice.
Ciao a tutti ))))
Aiuto nel consulente per limitare l'apertura di ordini a 1 al giorno, non importa quante volte passerà un punto di entrata...
Sto cercando di scrivere qualcosa del genere, controlla la cronologia dell'ultimo ordine chiuso prima di aprire, e se corrisponde allora non aprire...
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
{
if(OrderCloseTime()==Day()
break;
}
questo non funziona, per favore aiutate lamochinka ))))
ordine su una barra sito:mql4.com
https://www.mql5.com/ru/forum/102366/page3
Bisogno di aiuto nel cambiare l'EA, cioè lasciare tutto come è, ma cambiare l'azione (comprare/vendere) a (vendere/comprare), i miei test hanno mostrato che il trend rialzista è vendere, e il trend ribassista comprare. un semplice cambiamento nel codice COMPRARE su VENDERE me niente, o qualcosa perso, o .... Comunque, ho bisogno di aiuto
Grazie in anticipo.