Je suis autodidacte et je ne pourrai pas vous l'expliquer - j'ai simplement choisi les fonctions dont j'ai besoin, je sais que ceci va là et cela va là.
En gros, toutes les fonctions sont copiées des codes de Vladimir Karputov, pour lesquels je le remercie beaucoup ! - Il vous dira si vous avez des questions.
Vous êtes autodidacte, je viens de commencer à programmer, et ma tête est pleine de questions.
J'ai l'algorithme de cet EA dans ma tête et ce n'est pas un problème si je dois changer l'indicateur dans le processus, car il n'y a que deux tâches (point de direction - haut et point de direction - bas).
Pour l'instant, je pars du principe classique que le plus simple est le meilleur. C'est pourquoi je veux simplifier...... au maximum et en même temps tirer le meilleur parti de ce que je veux créer. Je vous propose de travailler ensemble sur mon algorithme - je pense que ce serait intéressant pour nous deux.
Si vous êtes intéressé, veuillez me contacter en personne.
Voici une autre option - une fois que la prise est déclenchée - elle s'ouvrira à nouveau dans la même direction.
Tout à fait exact, avec profit ! !!
A première vue - tout est correct.
Et le fait qu'il ne devrait pas y avoir de Stop Loss - tout est correct aussi.
Mais je ne comprends pas ce qui arrive à l'ordre, qui n'est pas fermé au Take Profit....... lorsque la direction du prix change.....(se ferme juste par défaut, c'est-à-dire sur le signal de l'indicateur de changement de tendance)? Si c'est le cas, ce n'est pas mon intention.
Et selon mon idée - l'ordre devrait rester, mais ici il devrait entrer en vigueur - une martin avec ses réglages :
input group "======== МАРТИН ========";
inputint MMType = 1; // 1 - вкл. , 2 - выкл.inputdouble Multiplikator = 1.667; // множитель следующего лотаinputdouble Step = 150.0; // Расстояние между ордерами
C'est-à-dire placer des ordres dans la direction opposée à la tendance avec un lot croissant et un take profit moyen. En bref, travailler comme un simple Martin, par exemple (Adviser Autoprofit 3), qui est dans la source ouverte dans le web, mais écrit en mql4.
À propos, la variante originale du travail de tendance, que vous avez correctement écrite, n'a pas été annulée lors de la collaboration avec Martin.
En bref, le travail de tendance est une tâche, que vous avez brillamment démontrée en partie, et la deuxième tâche est une martin.
Il n'est pas nécessaire que ces deux tâches soient liées entre elles - à mon avis, elles peuvent fonctionner de manière totalement indépendante.
Et le fait que le Stop Loss - ne devrait pas être là non plus - tout est correct.
Mais je n'ai pas compris où se trouvait l'oder, qui n'a pas clôturé au Take Profit....... lorsque la direction du prix change.....(il se ferme simplement par défaut, c'est-à-dire sur le signal de l'indicateur de changement de tendance)? Si c'est le cas, ce n'est pas mon intention.
Mais selon mon idée, l'ordre devrait rester, mais une martin avec ses réglages devrait entrer en vigueur ici :
Il en va de même pour l'autre côté, c'est-à-dire la mise en place d'ordres dans la direction opposée à la tendance avec une taille de lot croissante et un take profit moyen. En bref, travailler comme un simple Martin - par exemple (Autoprofit 3), qui est open source sur le web, mais écrit en mql4.
Une remarque à la fois : pas "ordre", mais "position".
toutes les options que j'ai pu trouver - il ne semble pas y en avoir d'autres.
//+------------------------------------------------------------------+//| 4 Sprut 185.mq5 |//| Copyright 2021, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2021, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"//---#define MACD_MAGIC 1234502//---#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---double m_adjusted_point; // point value adjusted for 3 or 5 points
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
CPositionInfo m_position; // trade position object
CAccountInfo m_account; // account info wrapper//---inputdouble InpLots =0.1; // Lotsinputint InpTakeProfit =50; // Take Profit (in pips)inputbool InpVariant =false; // Optioninputint InpBar =1; // Barinputbool InpClOp =false; // Close opposite//---double m_macd_current;
double m_signal_current;
double m_take_profit;
int price_uno;
int m_handle_macd; // MACD indicator handleint ExtTimeOut=10; // time out in seconds between trade operations//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- initialize common information
m_symbol.Name(Symbol()); // symbol
m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
m_trade.SetMarginMode();
m_trade.SetTypeFillingBySymbol(Symbol());
//--- tuning for 3 or 5 digitsint digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
m_adjusted_point=m_symbol.Point()*digits_adjust;
//--- set default deviation for trading in adjusted points
m_take_profit =InpTakeProfit*m_adjusted_point;
//--- set default deviation for trading in adjusted points
m_trade.SetDeviationInPoints(3*digits_adjust);
//--- create StepMA_NRTR indicator
m_handle_macd=iCustom(NULL,0,"StepMA_NRTR");
if(m_handle_macd==INVALID_HANDLE)
{
printf("Error creating StepMA_NRTR indicator");
return(false);
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick(void)
{
staticdatetime limit_time=0; // last trade processing time + timeout//--- don't process if timeoutif(TimeCurrent()>=limit_time)
{
//--- check for dataif(Bars(Symbol(),Period())>2)
{
//--- change limit time by timeout in seconds if processedif(!InpVariant && Processing())
limit_time=TimeCurrent()+ExtTimeOut;
//--- change limit time by timeout in seconds if processedif(InpVariant && Processing_1())
limit_time=TimeCurrent()+ExtTimeOut;
}
}
}
//+------------------------------------------------------------------+//| main function returns true if any position processed |//+------------------------------------------------------------------+bool Processing(void)
{
//--- refresh ratesif(!m_symbol.RefreshRates())
return(false);
double m_buff_MACD_main[],m_buff_MACD_signal[];
ArraySetAsSeries(m_buff_MACD_main,true);
ArraySetAsSeries(m_buff_MACD_signal,true);
int start_pos=InpBar,count=3;
if(!iGetArray(m_handle_macd,0,start_pos,count,m_buff_MACD_main)||
!iGetArray(m_handle_macd,1,start_pos,count,m_buff_MACD_signal))
{
return(false);
}
//---
m_macd_current =m_buff_MACD_main[0];
m_signal_current =m_buff_MACD_signal[0];
//---if(m_position.Select(Symbol()))
{
//--- try to close or modify long positionif(LongClosed())
return(true);
//--- try to close or modify short positionif(ShortClosed())
return(true);
}
else
{
//--- check for long position (BUY) possibilityif(LongOpened())
return(true);
//--- check for short position (SELL) possibilityif(ShortOpened())
return(true);
}
//--- exit without position processingreturn(false);
}
//+------------------------------------------------------------------+//| main function returns true if any position processed |//+------------------------------------------------------------------+bool Processing_1(void)
{
//--- refresh ratesif(!m_symbol.RefreshRates())
return(false);
double m_buff_MACD_main[],m_buff_MACD_signal[];
bool StNRUp,StNRDn;
ArraySetAsSeries(m_buff_MACD_main,true);
ArraySetAsSeries(m_buff_MACD_signal,true);
int start_pos=InpBar,count=3;
if(!iGetArray(m_handle_macd,0,start_pos,count,m_buff_MACD_main)||
!iGetArray(m_handle_macd,1,start_pos,count,m_buff_MACD_signal))
{
return(false);
}
//---
m_macd_current =m_buff_MACD_main[0];
m_signal_current =m_buff_MACD_signal[0];
//---
StNRUp=m_buff_MACD_main[0]<m_buff_MACD_signal[0];
StNRDn=m_buff_MACD_main[0]>m_buff_MACD_signal[0];
//--- BUY Signalif(StNRUp)
{
if(InpClOp)
if(ShortClosed())
Sleep(1000);
if(price_uno<0)
LongOpened();
price_uno=+1;
return(true);
}
//--- SELL Signalif(StNRDn)
{
if(InpClOp)
if(LongClosed())
Sleep(1000);
if(price_uno>0)
ShortOpened();
price_uno=-1;
return(true);
}
//--- exit without position processingreturn(false);
}
//+------------------------------------------------------------------+//| Check for long position closing |//+------------------------------------------------------------------+bool LongClosed(void)
{
bool res=false;
//--- should it be closed?if(m_macd_current>m_signal_current)
{
//--- close positionif(InpClOp)
ClosePositions(POSITION_TYPE_BUY);
//--- processed and cannot be modified
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Check for short position closing |//+------------------------------------------------------------------+bool ShortClosed(void)
{
bool res=false;
//--- should it be closed?if(m_macd_current<m_signal_current)
{
//--- close positionif(InpClOp)
ClosePositions(POSITION_TYPE_SELL);
//--- processed and cannot be modified
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Check for long position opening |//+------------------------------------------------------------------+bool LongOpened(void)
{
bool res=false;
//--- check for long position (BUY) possibilityif(m_macd_current<m_signal_current)
{
double price=m_symbol.Ask();
double tp =m_symbol.Bid()+m_take_profit;
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,InpLots,price)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
else
{
//--- open positionif(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
printf("Position by %s to be opened",Symbol());
else
{
printf("Error opening BUY position by %s : '%s'",Symbol(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
}
PlaySound("ok.wav");
}
//--- in any case we must exit from expert
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Check for short position opening |//+------------------------------------------------------------------+bool ShortOpened(void)
{
bool res=false;
//--- check for short position (SELL) possibilityif(m_macd_current>m_signal_current)
{
double price=m_symbol.Bid();
double tp =m_symbol.Ask()-m_take_profit;
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,InpLots,price)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
else
{
//--- open positionif(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
printf("Position by %s to be opened",Symbol());
else
{
printf("Error opening SELL position by %s : '%s'",Symbol(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
}
PlaySound("ok.wav");
}
//--- in any case we must exit from expert
res=true;
}
//--- resultreturn(res);
}
//+------------------------------------------------------------------+//| Refreshes the symbol quotes data |//+------------------------------------------------------------------+bool RefreshRates()
{
//--- refresh ratesif(!m_symbol.RefreshRates())
{
return(false);
}
//--- protection against the return value of "zero"if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
{
return(false);
}
//---return(true);
}
//+------------------------------------------------------------------+//| Check Freeze and Stops levels |//+------------------------------------------------------------------+void FreezeStopsLevels(double &freeze,double &stops)
{
//--- check Freeze and Stops levelsdouble coeff=(double)1;
if(!RefreshRates() || !m_symbol.Refresh())
return;
//--- FreezeLevel -> for pending order and modificationdouble freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
if(freeze_level==0.0)
if(1>0)
freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//--- StopsLevel -> for TakeProfit and StopLossdouble stop_level=m_symbol.StopsLevel()*m_symbol.Point();
if(stop_level==0.0)
if(1>0)
stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//---
freeze=freeze_level;
stops=stop_level;
//---return;
}
//+------------------------------------------------------------------+//| Close positions |//+------------------------------------------------------------------+void ClosePositions(constENUM_POSITION_TYPE pos_type)
{
double freeze=0.0,stops=0.0;
FreezeStopsLevels(freeze,stops);
for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positionsif(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
if(m_position.PositionType()==pos_type)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.TakeProfit()-m_position.PriceCurrent()>=freeze) || m_position.TakeProfit()==0.0);
bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.PriceCurrent()-m_position.StopLoss()>=freeze) || m_position.StopLoss()==0.0);
if(take_profit_level && stop_loss_level)
if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbolPrint(__FILE__," ",__FUNCTION__,", ERROR: ","BUY PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
}
if(m_position.PositionType()==POSITION_TYPE_SELL)
{
bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.PriceCurrent()-m_position.TakeProfit()>=freeze) || m_position.TakeProfit()==0.0);
bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.StopLoss()-m_position.PriceCurrent()>=freeze) || m_position.StopLoss()==0.0);
if(take_profit_level && stop_loss_level)
if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbolPrint(__FILE__," ",__FUNCTION__,", ERROR: ","SELL PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
}
PlaySound("ok.wav");
}
}
//+------------------------------------------------------------------+//| Filling the indicator buffers from the indicator |//+------------------------------------------------------------------+bool iGetArray(constint handle,constint buffer,constint start_pos,
constint count,double &arr_buffer[])
{
bool result=true;
if(!ArrayIsDynamic(arr_buffer))
{
return(false);
}
ArrayFree(arr_buffer);
//--- reset error codeResetLastError();
//--- fill a part of the iBands array with values from the indicator bufferint copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
if(copied!=count)
{
return(false);
}
return(result);
}
//+------------------------------------------------------------------+
toutes les options que j'ai pu trouver - il ne semble pas y en avoir d'autres.
Que se passe-t-il si vous essayez d'utiliser 2 blocs indépendants dans votre Expert Advisor. Ensuite, l'un d'eux fonctionnera seul, puisque vous avez déjà travaillé sur la - tendance (en utilisant un indicateur)...........
Et le second par le signal fixé par le premier bloc - par position - et non par tendance.........
Je l'ai déjà écrit ci-dessus :
Ces deux tâches ne doivent pas nécessairement être liées - à mon avis, elles peuvent fonctionner de manière totalement indépendante.
Un tel algorithme que je propose (à mon avis) n'a pas encore été utilisé par les programmeurs. En tout cas, je n'ai pas trouvé une telle solution - sur Internet.
Sprut 185: Cet algorithme que je propose - (à mon avis) n'a pas encore été utilisé par les programmeurs. En tout cas, je n'ai pas trouvé une telle solution sur Internet.
il n'est probablement pas possible de le mettre en œuvre
il ne donne pas - sur le symbole, il doit y avoir une position (s'il est fermé sur un profit et rouvert une position) (et lorsque le signal opposé est appliqué - il ne peut pas ouvrir dans l'autre sens
if(m_position.Select(Symbol()))
si c'est juste à partir d'un signal (d'un point) il n'y a pas de problème . (et cela ne devrait pas être présent dans le code (ligne ci-dessus)))
il n'est probablement pas possible de le mettre en œuvre
il ne donne pas - sur le symbole, il doit y avoir une position (s'il est fermé sur un profit et rouvert une position) (et lorsque le signal opposé est appliqué - il ne peut pas ouvrir dans l'autre sens
si c'est juste à partir d'un signal (d'un point) il n'y a pas de problème . (et alors, il ne devrait pas être présent dans le code (ligne ci-dessus)))
Je vois - c'est probablement la raison pour laquelle je n'ai pas trouvé une telle solution sur Internet. Mais à mon avis, il doit y avoir une solution à ce problème.
Merci - je vais chercher une solution à ce problème......
Je suis autodidacte et je ne pourrai pas vous l'expliquer - j'ai simplement choisi les fonctions dont j'ai besoin, je sais que ceci va là et cela va là.
En gros, toutes les fonctions sont copiées des codes de Vladimir Karputov, pour lesquels je le remercie beaucoup ! - Il vous dira si vous avez des questions.
Vous êtes autodidacte, je viens de commencer à programmer, et ma tête est pleine de questions.
J'ai l'algorithme de cet EA dans ma tête et ce n'est pas un problème si je dois changer l'indicateur dans le processus, car il n'y a que deux tâches (point de direction - haut et point de direction - bas).
L'héritage implique la création d'une classe.
J'écris donc : de quelle classe dois-je hériter pour utiliser ces méthodes de leur bibliothèque standard ?
Voici une autre option - une fois que la prise est déclenchée - elle s'ouvrira à nouveau dans la même direction.
Tout à fait exact, avec profit ! !!
A première vue - tout est correct.
Et le fait qu'il ne devrait pas y avoir de Stop Loss - tout est correct aussi.
Mais je ne comprends pas ce qui arrive à l'ordre, qui n'est pas fermé au Take Profit....... lorsque la direction du prix change.....(se ferme juste par défaut, c'est-à-dire sur le signal de l'indicateur de changement de tendance)? Si c'est le cas, ce n'est pas mon intention.
Et selon mon idée - l'ordre devrait rester, mais ici il devrait entrer en vigueur - une martin avec ses réglages :
C'est-à-dire placer des ordres dans la direction opposée à la tendance avec un lot croissant et un take profit moyen. En bref, travailler comme un simple Martin, par exemple (Adviser Autoprofit 3), qui est dans la source ouverte dans le web, mais écrit en mql4.
À propos, la variante originale du travail de tendance, que vous avez correctement écrite, n'a pas été annulée lors de la collaboration avec Martin.
En bref, le travail de tendance est une tâche, que vous avez brillamment démontrée en partie, et la deuxième tâche est une martin.
Il n'est pas nécessaire que ces deux tâches soient liées entre elles - à mon avis, elles peuvent fonctionner de manière totalement indépendante.
Tout à fait juste, avec des bénéfices ! !!
A première vue - tout est correct.
Et le fait que le Stop Loss - ne devrait pas être là non plus - tout est correct.
Mais je n'ai pas compris où se trouvait l'oder, qui n'a pas clôturé au Take Profit....... lorsque la direction du prix change.....(il se ferme simplement par défaut, c'est-à-dire sur le signal de l'indicateur de changement de tendance)? Si c'est le cas, ce n'est pas mon intention.
Mais selon mon idée, l'ordre devrait rester, mais une martin avec ses réglages devrait entrer en vigueur ici :
Il en va de même pour l'autre côté, c'est-à-dire la mise en place d'ordres dans la direction opposée à la tendance avec une taille de lot croissante et un take profit moyen. En bref, travailler comme un simple Martin - par exemple (Autoprofit 3), qui est open source sur le web, mais écrit en mql4.Une remarque à la fois : pas "ordre", mais "position".
Une remarque à la fois : pas "ordre" mais "position".
toutes les options que j'ai pu trouver - il ne semble pas y en avoir d'autres.
toutes les options que j'ai pu trouver - il ne semble pas y en avoir d'autres.
Je l'ai déjà écrit ci-dessus :
Ces deux tâches ne doivent pas nécessairement être liées - à mon avis, elles peuvent fonctionner de manière totalement indépendante.
Un tel algorithme que je propose (à mon avis) n'a pas encore été utilisé par les programmeurs. En tout cas, je n'ai pas trouvé une telle solution - sur Internet.
il n'est probablement pas possible de le mettre en œuvre
il ne donne pas - sur le symbole, il doit y avoir une position (s'il est fermé sur un profit et rouvert une position) (et lorsque le signal opposé est appliqué - il ne peut pas ouvrir dans l'autre sens
si c'est juste à partir d'un signal (d'un point) il n'y a pas de problème . (et cela ne devrait pas être présent dans le code (ligne ci-dessus)))
il n'est probablement pas possible de le mettre en œuvre
il ne donne pas - sur le symbole, il doit y avoir une position (s'il est fermé sur un profit et rouvert une position) (et lorsque le signal opposé est appliqué - il ne peut pas ouvrir dans l'autre sens
si c'est juste à partir d'un signal (d'un point) il n'y a pas de problème . (et alors, il ne devrait pas être présent dans le code (ligne ci-dessus)))
Après la mise à niveau vers la version 2981, une erreur a commencé à apparaître dans la ligne