Il semble s'être connecté, plus d'erreurs, mais ça ne fonctionne toujours pas. N'ouvre aucun marché. Je ne comprends pas où il n'y a pas de connexion entre les parties du code :
S'il vous plaît, voyez ce que j'ai fait de mal ?
//+-----------------------------------------------------------------------------------------------+//| Simple Moving Average.mq4 |//| Copyright 2016, Andrey Minaev |//| https://www.mql5.com/ru/users/id.scorpion |//+-----------------------------------------------------------------------------------------------+#property copyright"Copyright 2016, Andrey Minaev"#property link"https://www.mql5.com/ru/users/id.scorpion"#property version"1.00"#property strict// Параметры советникаexternstring sParametersEA = ""; // Параметры советникаexterndouble dLots = 0.01; // Количество лотовexternint iStopLoss = 30; // Уровень убытка (в пунктах)externint iTakeProfit = 30; // Уровень прибыли (в пунктах)externint iSlippage = 3; // Проскальзование (в пунктах)externint iMagic = 1; // Индентификатор советникаexterndouble K_Martin = 2.0; // Умножает лот после SL. пока не получим TPexternint OrdersClose = 5;
externint DigitsLot = 2;
// Параметры индикатораexternstring sParametersMA = ""; // Параметры индикатораexternint iPeriodMA = 14; // Период усреднения// Глобальные переменныеdouble dMA;
double MINLOT,MAXLOT,MaxMartinLot;
//+-----------------------------------------------------------------------------------------------+intOnInit()
{
// Если брокер использует 3 или 5 знаков после запятой, то умножаем на 10if(Digits == 3 || Digits == 5)
{
iStopLoss *= 10;
iTakeProfit *= 10;
iSlippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+-----------------------------------------------------------------------------------------------+voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0, iPeriodMA, 0, MODE_SMA, PRICE_CLOSE, 0);
// Если нет открытых ордеров, то входим в условиеif(bCheckOrders() == true)
{
// Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция проверки открытых оредров |//+-----------------------------------------------------------------------------------------------+bool bCheckOrders()
{
// Переберем в цикле ордера, для проверки открытых ордеров данным советникомfor(int i = 0; i <= OrdersTotal(); i++)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMagic)
return(false);
return(true);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на покупку |//+-----------------------------------------------------------------------------------------------+bool bSignalBuy()
{
if(dMA > Open[1] && dMA < Close[1])
return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на продажу |//+-----------------------------------------------------------------------------------------------+bool bSignalSell()
{
if(dMA < Open[1] && dMA > Close[1])
return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на покупку |//+-----------------------------------------------------------------------------------------------+void vOrderOpenBuy()
{
int iOTi = 0; // Тикет ордера
iOTi = OrderSend(Symbol(), OP_BUY, Lots(), Ask, iSlippage, 0, 0, "", iMagic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на продажу |//+-----------------------------------------------------------------------------------------------+void vOrderOpenSell()
{
int iOTi = 0; // Тикет ордера
iOTi = OrderSend(Symbol(), OP_SELL, Lots(), Bid, iSlippage, 0, 0, "", iMagic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
}
//+-----------------------------------------------------------------------------------------------+//| Функция модификации ордера |//+-----------------------------------------------------------------------------------------------+void vOrderModify(int iOTi)
{
int iOTy = -1; // Тип ордераdouble dOOP = 0; // Цена открытия ордераdouble dOSL = 0; // Стоп Лоссint iMag = 0; // Идентификатор советникаdouble dSL = 0; // Уровень убыткаdouble dTP = 0; // Уровень прибыли// Выберем по тикету открытый ордер, получим некоторые значенияif(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
{
iOTy = OrderType();
dOOP = OrderOpenPrice();
dOSL = OrderStopLoss();
iMag = OrderMagicNumber();
}
// Если ордер открыл данный советник, то входим в условиеif(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
{
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордерif(dOSL == 0)
{
if(iOTy == OP_BUY)
{
dSL = NormalizeDouble(dOOP - iStopLoss * Point, Digits);
dTP = NormalizeDouble(dOOP + iTakeProfit * Point, Digits);
bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
}
if(iOTy == OP_SELL)
{
dSL = NormalizeDouble(dOOP + iStopLoss * Point, Digits);
dTP = NormalizeDouble(dOOP - iTakeProfit * Point, Digits);
bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
}
}
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция обработки ошибок |//+-----------------------------------------------------------------------------------------------+void vError(int iErr)
{
switch(iErr)
{
case129: // Неправильная ценаcase135: // Цена измениласьcase136: // Нет ценcase138: // Новые ценыSleep(1000);
RefreshRates();
break;
case137: // Брокер занятcase146: // Подсистема торговли занятаSleep(3000);
RefreshRates();
break;
}
}
//+-----------------------------------------------------------------------------------------------+//+------------------------------------------------------------------+//| Расчет лота |//+------------------------------------------------------------------+double Lots()
{
double L=0;
// если последняя закрытая сделка убыточная и лот равен стартовому// включаем Мартинif(GetInfoLastPos(2)<0&&GetInfoLastPos(1)==dLots)
{
K_Martin=true;
}
// если последняя закрытая сделка убыточная и лот больше или равен максимальному// выключаем Мартинif(GetInfoLastPos(2)<0&&GetInfoLastPos(1)>=MaxMartinLot)
{
K_Martin=false;
}
// если последняя закрытая сделка убыточная и Мартин включен, умножаем лотif(K_Martin==true)
{
L=NormalizeDouble(GetInfoLastPos(1)*K_Martin,DigitsLot);
}
// если последняя закрытая сделка убыточная и Мартин выключен, делим лотif(K_Martin==false)
{
L=NormalizeDouble(GetInfoLastPos(1)/K_Martin,DigitsLot);
}
if(L>MAXLOT) L = MAXLOT;
if(L<MINLOT) L = MINLOT;
return(L);
}
//+----------------------------------------------------------------------------+//| Функция возвращает по символу и магику |//| 1 - размер лота последней закрытой позиции |//| 2 - размер профита с учетом комиссии и свопа последней закрытой позиции |//| 3 - время последней закрытой позиции |//+----------------------------------------------------------------------------+double GetInfoLastPos(int a=1)
{
datetime t=0;
double result=0,l=0,p=0,f=0;
int i=OrdersHistoryTotal();
for(int pos=0; pos<i; pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol()==_Symbol && OrderMagicNumber()==iMagic)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
}
}
}
}
if(a==1) {result=l;} elseif(a==2) {result=p;} elseif(a==3) {result=(double)t;}
else {result=0;}
return(result);
}
//+------------------------------------------------------------------+
Il semble s'être connecté, plus d'erreurs, mais ça ne fonctionne toujours pas. N'ouvre aucun marché. Je ne comprends pas où il n'y a pas de connexion entre les parties du code :
S'il te plaît, regarde ce que j'ai fait de mal ?
mauvais
//+------------------------------------------------------------------+//| Расчет лота |//+------------------------------------------------------------------+double Lots()
{
double L=0;
// если последняя закрытая сделка убыточная и лот равен стартовому// включаем Мартинif(GetInfoLastPos(2)<0&&GetInfoLastPos(1)==dLots)
{
K_Martin=true;
}
// если последняя закрытая сделка убыточная и лот больше или равен максимальному// выключаем Мартинif(GetInfoLastPos(2)<0&&GetInfoLastPos(1)>=MaxMartinLot)
{
K_Martin=false;
}
// если последняя закрытая сделка убыточная и Мартин включен, умножаем лотif(K_Martin==true)
{
L=NormalizeDouble(GetInfoLastPos(1)*K_Martin,DigitsLot);
}
// если последняя закрытая сделка убыточная и Мартин выключен, делим лотif(K_Martin==false)
{
L=NormalizeDouble(GetInfoLastPos(1)/K_Martin,DigitsLot);
}
if(L>MAXLOT) L = MAXLOT;
if(L<MINLOT) L = MINLOT;
return(L);
}
Il semble s'être connecté, plus d'erreurs, mais ça ne fonctionne toujours pas. N'ouvre aucun marché. Je ne comprends pas où il n'y a pas de connexion entre les parties du code :
S'il vous plaît, voyez ce que j'ai fait de mal ?
La fonction"calcul du lot", mise comme je l'ai donné (pas de changement)
et ajoutez les éléments mis en évidence
// Глобальные переменныеdouble dMA;
double MINLOT,MAXLOT;
double MaxMartinLot;
bool Martin=false;//+-----------------------------------------------------------------------------------------------+intOnInit()
{
MaxMartinLot=Lot*MathPow(K_Martin,3);// Если брокер использует 3 или 5 знаков после запятой, то умножаем на 10if(Digits == 3 || Digits == 5)
{
iStopLoss *= 10;
iTakeProfit *= 10;
iSlippage *= 10;
}
return(INIT_SUCCEEDED);
}
double Lots()
{
double L=0;
// если последняя закрытая сделка убыточная и лот равен стартовому// включаем Мартинif(GetInfoLastPos(2)<0&&GetInfoLastPos(1)==dLots)
{
Martin=true;
}
// если последняя закрытая сделка убыточная и лот больше или равен максимальному// выключаем Мартинif(GetInfoLastPos(2)<0&&GetInfoLastPos(1)>=MaxMartinLot)
{
Martin=false;
}
// если последняя закрытая сделка убыточная и Мартин включен, умножаем лотif(Martin==true)
{
L=NormalizeDouble(GetInfoLastPos(1)*K_Martin,DigitsLot);
}
// если последняя закрытая сделка убыточная и Мартин выключен, делим лотif(Martin==false)
{
L=NormalizeDouble(GetInfoLastPos(1)/K_Martin,DigitsLot);
}
if(L>MAXLOT) L = MAXLOT;
if(L<MINLOT) L = MINLOT;
return(L);
}
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
comment l'épeler correctement ?
"a" * "c" "x" fois, soit
si "x=3"
alors "a*v*v*v"
a*MathPow(b,x)Merci, mais cela ne simplifie en rien mon code)
C'est pourquoi j'essaie de calculer le milieu de la fourchette, au lieu du module de 2 conditions, de la différence et d'une condition.
Merci beaucoup !
Il semble s'être connecté, plus d'erreurs, mais ça ne fonctionne toujours pas. N'ouvre aucun marché. Je ne comprends pas où il n'y a pas de connexion entre les parties du code :
S'il vous plaît, voyez ce que j'ai fait de mal ?
Merci beaucoup !
Il semble s'être connecté, plus d'erreurs, mais ça ne fonctionne toujours pas. N'ouvre aucun marché. Je ne comprends pas où il n'y a pas de connexion entre les parties du code :
S'il te plaît, regarde ce que j'ai fait de mal ?
mauvais
Merci beaucoup !
Il semble s'être connecté, plus d'erreurs, mais ça ne fonctionne toujours pas. N'ouvre aucun marché. Je ne comprends pas où il n'y a pas de connexion entre les parties du code :
S'il vous plaît, voyez ce que j'ai fait de mal ?
La fonction"calcul du lot", mise comme je l'ai donné (pas de changement)
et ajoutez les éléments mis en évidence
mauvais.
Merci.
Je l'ai remis comme il était. Il émet trois erreurs : 'Martin' - identifiant non déclaré.
Dois-je définir une autre variable globale?
Merci.
Je l'ai remis comme il était. Trois erreurs : 'Martin' - identifiant non déclaré
Dois-je définir une autre variable globale?
Ici
La fonction"Calcul du lot", paramétrer comme je l'ai donné (pas de changement).
et ajoutez les éléments mis en évidence
fait.
Maintenant, "Lot" est un identifiant non déclaré.
J'ai besoin de : extern double dLots= 0.01 ; remplacer par : extern double Lot= 0.01 ; ?
Oh non... ça ne marche pas non plus.