Questions des débutants MQL5 MT5 MetaTrader 5 - page 723
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
On me dit ce que je fais mal, pourquoi deux indicateurs : iRSI,iCCI... ne pose pas de problème, mais les muwings et BB donnent un avertissement (perte possible de données due à la conversion de type Indicateur.mqh )
//| Indicator.mqh |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
// интерфейс к индикаторам.
class CIndicators
{
public:
double iRSI(string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift);
double iCCI(string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift);
double iBands(string symbol,ENUM_TIMEFRAMES tf,int BBPeriod,int shift,double BBDeviation,ENUM_APPLIED_PRICE BBPrice );
double iMA(string symbol,ENUM_TIMEFRAMES tf, int nMAPeriod,int shift, ENUM_MA_METHOD eMAMethod ,ENUM_APPLIED_PRICE MAPrice);
};
// -Создадим экземпляр индикатора iRSI
double CIndicators::iRSI(string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift)
{
//---
int hRSI = iRSI(symbol, tf, period, applied);
if(hRSI == INVALID_HANDLE)
return 0.0;
double rsi[];
CopyBuffer(hRSI, 0, shift, 1, rsi);
if(ArraySize(rsi))
return rsi[0];
return 0.0;
//--Создадим экземпляр индикатора iCCI
}
//----------------------------------
double CIndicators::iCCI(string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift)
{
int hCCI = iCCI(Symbol(), PERIOD_CURRENT, 55, PRICE_CLOSE);
if(hCCI == INVALID_HANDLE)return 0.0;
double cci[];
ArrayResize(cci, 1);
CopyBuffer(hCCI, 0, 0, 1, cci);
return cci[0];
}
//--------------------------------------------------
// Создадим экземпляр индикатора ВВ
double CIndicators::iBands(string symbol,ENUM_TIMEFRAMES tf,int BBPeriod,int shift,double BBDeviation,ENUM_APPLIED_PRICE BBPrice)
{
int hBands = iBands(Symbol(),tf,BBPeriod,0,BBDeviation,PRICE_CLOSE);
if(hBands==INVALID_HANDLE)return 0.0;
// Создадим массив значений верхней границы ВВ
double fBBUpper[];
ArrayResize(fBBUpper,true);
CopyBuffer(hBands,UPPER_BAND,0,3,fBBUpper);
return fBBUpper[0];
// Создадим массив значений нижней границы ВВ
double fBBLower[];
ArraySetAsSeries(fBBLower,true);
CopyBuffer(hBands,LOWER_BAND,0,3,fBBLower);
return fBBLower[0];
}
// Создадим экземпляр индикатора МА
double CIndicators::iMA(string symbol,ENUM_TIMEFRAMES tf, int nMAPeriod,int shift, ENUM_MA_METHOD eMAMethod ,ENUM_APPLIED_PRICE MAPrice)
{
// получим его хэндл
int hMA=iMA(Symbol(), PERIOD_CURRENT, nMAPeriod,0,MODE_EMA,PRICE_CLOSE);
if(hMA == INVALID_HANDLE)return 0.0;
// Создадим массив значений МА,заполним тремя последними значениями мувинга.
double fMA[];
ArraySetAsSeries(fMA,true);
CopyBuffer(hMA,0,0,3,fMA);
return fMA[0];
}
Je voudrais également demander : Que dois-je changer dans la demande de transaction, l'erreur 10030 est apparue, l'année précédente le code Expert Advisor fonctionnait sans aucun problème, et maintenant cela me fait lire/rechercher les changements dans MQL5 à nouveau
// функция открытия позиции с рынка
bool MarketOrder(const string sSymbol, const ENUM_POSITION_TYPE eType, const double fLot, const int nSL = 0, const int nTP = 0, const ulong nMagic = 0, const uint nSlippage = 1000)
{
bool bRetVal = false;
// запрос
MqlTradeRequest oRequest = {0};
MqlTradeResult oResult = {0};
double fPoint = SymbolInfoDouble(sSymbol, SYMBOL_POINT);
int nDigits = (int) SymbolInfoInteger(sSymbol, SYMBOL_DIGITS);
oRequest.action = TRADE_ACTION_DEAL;
oRequest.symbol = sSymbol;
oRequest.volume = fLot;
oRequest.stoplimit = 0;
oRequest.deviation = nSlippage;
if(eType == POSITION_TYPE_BUY)
{
oRequest.type = ORDER_TYPE_BUY;
oRequest.price = NormalizeDouble(SymbolInfoDouble(sSymbol, SYMBOL_ASK), nDigits);
oRequest.sl = NormalizeDouble(oRequest.price - nSL * fPoint, nDigits) * (nSL > 0);
oRequest.tp = NormalizeDouble(oRequest.price + nTP * fPoint, nDigits) * (nTP > 0);
}
if(eType == POSITION_TYPE_SELL)
{
oRequest.type = ORDER_TYPE_SELL;
oRequest.price = NormalizeDouble(SymbolInfoDouble(sSymbol, SYMBOL_BID), nDigits);
oRequest.sl = NormalizeDouble(oRequest.price + nSL * fPoint, nDigits) * (nSL > 0);
oRequest.tp = NormalizeDouble(oRequest.price - nTP * fPoint, nDigits) * (nTP > 0);
}
// определим допустимый тип заливки ордера (зависит от типа исполнения - Instant, Market, биржевое и т.д.)
switch((int) SymbolInfoInteger(sSymbol, SYMBOL_FILLING_MODE))
{
case SYMBOL_FILLING_FOK:
oRequest.type_filling = ORDER_FILLING_FOK;
break;
case SYMBOL_FILLING_IOC:
oRequest.type_filling = ORDER_FILLING_IOC;
break;
default:
oRequest.type_filling = ORDER_FILLING_RETURN;
}
oRequest.magic = nMagic;
// проверка перед отправкой
MqlTradeCheckResult oCheckResult= {0};
bool bCheck = OrderCheck(oRequest, oCheckResult);
Print("Проверка заявки MarketOrder:",
" OrderCheck = ", bCheck,
", retcode = ", oCheckResult.retcode,
", balance = ", NormalizeDouble(oCheckResult.balance, 2),
", equity = ", NormalizeDouble(oCheckResult.equity, 2),
", margin = ", NormalizeDouble(oCheckResult.margin, 2),
", margin_free = ", NormalizeDouble(oCheckResult.margin_free, 2),
", margin_level = ", NormalizeDouble(oCheckResult.margin_level, 2),
", comment = ", oCheckResult.comment);
// если проверка удачная - отправка заявки
if(bCheck == true && oCheckResult.retcode == 0)
{
bool bResult = false;
// 3 попытки выставления ордера
for(int k = 0; k < 3; k++)
{
bResult = OrderSend(oRequest, oResult);
if(bResult == true && oResult.retcode == TRADE_RETCODE_DONE)
break;
if(k == 2)
break;
Sleep(100);
}
Print("Отправка заявки:",
" OrderSend = ", bResult,
", retcode = ", oResult.retcode,
", deal = ", oResult.deal,
", order = ", oResult.order,
", volume = ", NormalizeDouble(oResult.volume, 2),
", price = ", NormalizeDouble(oResult.price, _Digits),
", bid = ", NormalizeDouble(oResult.bid, _Digits),
", ask = ", NormalizeDouble(oResult.ask, _Digits),
", comment = ", oResult.comment,
", request_id = ",oResult.request_id);
if(oResult.retcode == TRADE_RETCODE_DONE)
bRetVal = true;
}
else if(oResult.retcode == TRADE_RETCODE_NO_MONEY)
{
Print("Недостаточно денег для открытия позиции. Работа эксперта прекращена.");
ExpertRemove();
}
return(bRetVal);
}
Et je voulais aussi demander : Qu'est-ce qui doit être changé dans la demande de transaction, il y a une erreur 10030,,, avant le code du conseiller expert a fonctionné sans problèmes et maintenant il me force à nouveau à lire/rechercher les changements dans MQL5.
// функция открытия позиции с рынка
bool MarketOrder(const string sSymbol, const ENUM_POSITION_TYPE eType, const double fLot, const int nSL = 0, const int nTP = 0, const ulong nMagic = 0, const uint nSlippage = 1000)
{
bool bRetVal = false;
// запрос
MqlTradeRequest oRequest = {0};
MqlTradeResult oResult = {0};
double fPoint = SymbolInfoDouble(sSymbol, SYMBOL_POINT);
int nDigits = (int) SymbolInfoInteger(sSymbol, SYMBOL_DIGITS);
oRequest.action = TRADE_ACTION_DEAL;
oRequest.symbol = sSymbol;
oRequest.volume = fLot;
oRequest.stoplimit = 0;
oRequest.deviation = nSlippage;
if(eType == POSITION_TYPE_BUY)
{
oRequest.type = ORDER_TYPE_BUY;
oRequest.price = NormalizeDouble(SymbolInfoDouble(sSymbol, SYMBOL_ASK), nDigits);
oRequest.sl = NormalizeDouble(oRequest.price - nSL * fPoint, nDigits) * (nSL > 0);
oRequest.tp = NormalizeDouble(oRequest.price + nTP * fPoint, nDigits) * (nTP > 0);
}
if(eType == POSITION_TYPE_SELL)
{
oRequest.type = ORDER_TYPE_SELL;
oRequest.price = NormalizeDouble(SymbolInfoDouble(sSymbol, SYMBOL_BID), nDigits);
oRequest.sl = NormalizeDouble(oRequest.price + nSL * fPoint, nDigits) * (nSL > 0);
oRequest.tp = NormalizeDouble(oRequest.price - nTP * fPoint, nDigits) * (nTP > 0);
}
// определим допустимый тип заливки ордера (зависит от типа исполнения - Instant, Market, биржевое и т.д.)
switch((int) SymbolInfoInteger(sSymbol, SYMBOL_FILLING_MODE))
{
case SYMBOL_FILLING_FOK:
oRequest.type_filling = ORDER_FILLING_FOK;
break;
case SYMBOL_FILLING_IOC:
oRequest.type_filling = ORDER_FILLING_IOC;
break;
default:
oRequest.type_filling = ORDER_FILLING_RETURN;
}
oRequest.magic = nMagic;
// проверка перед отправкой
MqlTradeCheckResult oCheckResult= {0};
bool bCheck = OrderCheck(oRequest, oCheckResult);
Print("Проверка заявки MarketOrder:",
" OrderCheck = ", bCheck,
", retcode = ", oCheckResult.retcode,
", balance = ", NormalizeDouble(oCheckResult.balance, 2),
", equity = ", NormalizeDouble(oCheckResult.equity, 2),
", margin = ", NormalizeDouble(oCheckResult.margin, 2),
", margin_free = ", NormalizeDouble(oCheckResult.margin_free, 2),
", margin_level = ", NormalizeDouble(oCheckResult.margin_level, 2),
", comment = ", oCheckResult.comment);
// если проверка удачная - отправка заявки
if(bCheck == true && oCheckResult.retcode == 0)
{
bool bResult = false;
// 3 попытки выставления ордера
for(int k = 0; k < 3; k++)
{
bResult = OrderSend(oRequest, oResult);
if(bResult == true && oResult.retcode == TRADE_RETCODE_DONE)
break;
if(k == 2)
break;
Sleep(100);
}
Print("Отправка заявки:",
" OrderSend = ", bResult,
", retcode = ", oResult.retcode,
", deal = ", oResult.deal,
", order = ", oResult.order,
", volume = ", NormalizeDouble(oResult.volume, 2),
", price = ", NormalizeDouble(oResult.price, _Digits),
", bid = ", NormalizeDouble(oResult.bid, _Digits),
", ask = ", NormalizeDouble(oResult.ask, _Digits),
", comment = ", oResult.comment,
", request_id = ",oResult.request_id);
if(oResult.retcode == TRADE_RETCODE_DONE)
bRetVal = true;
}
else if(oResult.retcode == TRADE_RETCODE_NO_MONEY)
{
Print("Недостаточно денег для открытия позиции. Работа эксперта прекращена.");
ExpertRemove();
}
return(bRetVal);
}
J'écrirais la partie surlignée comme suit :
J'écrirais la partie surlignée comme ceci :
Du fond de mon cœur... ! !! )
Ça a marché, ça a marché !
Merci Alexei !!!!!!!!!!!!!!
Bonne journée. Pouvez-vous nous suggérer un EA pour MT5? Pouvez-vous nous suggérer un EA avec un trailing stop ? De préférenceun SCALPER ou un EA qui fonctionne sur les NEWS ou autres. Merci d'avance.
Veuillez expliquer comment installer l'indicateur acheté sur le terminal, car je l'ai acheté, mais je n'arrive pas à l'activer, je ne sais pas quel est le problème ?
Clarifiez : avez-vous acheté au Marché?
Après l'achat, j'ai cliqué sur "Installer dans le terminal", puis je suis allé dans le terminal de trading, mais rien ne s'est passé, l'indicateur n'est pas apparu.