Coder en MQL5 le Portefeuille Permanent de Harry Browne

Présentation, Développement, Améliorations et Ressources pour les Stratégies de Trading Automatique.

Modérateur : Administrateurs

Message
Auteur
Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Coder en MQL5 le Portefeuille Permanent de Harry Browne

#1 Message par Pierre8r »

Bonjour,

J'ai le projet de coder en MQL5 le Portefeuille Permanent de Harry Browne sous la forme d'un Expert Advisor.
Cela me permettra de le tester avec des ETFs en ouvrant un compte démo Admiral.Invest chez https://admiralmarkets.fr/

Mes motivations :
  • Backtester moi-même le Portefeuille Permanent de Harry Browne.
    Tester la fonctionnalité backtest multi-produits de MetaTrader 5.
Présentation du Portefeuille Permanent de Harry Browne :
http://investir-et-devenir-libre.com/in ... les-coups/
https://www.cafedelabourse.com/lexique/ ... -permanent

Quels ETFs choisir ? :
Je propose ces 4 ETF, GLD, SHY, TLT, VTI, indiqués dans cet article :
https://seekingalpha.com/article/158244 ... o-approach
Those assets are (for US Investors) Stocks, Long Term Treasury Bonds, Treasury Money Market Funds and Gold. So, a 4-asset Perm Port might have VTI, TLT, SHY, and GLD.
Ces 4 ETFs sont disponibles avec l'ouverture d'un compte démo Admiral.Invest.

Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#2 Message par Trader55 »

Pierre, tu en es où de la programmation en MT5 ?

C'est bon ? Tu as réussi à transcrire de MQL4 à MQL5 ?

Tu as tout fait à la main ? Ou utiliser un convertisseur ?

Bref, dis nous en plus sur ce que tu as déjà fait. Je suis aller voir ton blog, mais il n'y a rien.

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#3 Message par Pierre8r »

Bonjour Trader55,
tu en es où de la programmation en MT5 ?
J'apprends à mon rythme, et selon mes disponibilités.
Cet EA c'est aussi pour essayer de mieux maitriser MQL5.
C'est bon ? Tu as réussi à transcrire de MQL4 à MQL5 ?
Je ne transcris pas, je code direct en MQL5.
Tu as tout fait à la main ? Ou utiliser un convertisseur ?
Tout avec mes petites mains.

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#4 Message par Pierre8r »

Si quelqu'un souhaite m'aider à coder cet EA je l’accueil avec grand plaisir.

La procédure :
Nous travaillons en programmation en binôme à distance suivant les compétences de chacun.

Les conditions :
- Vous êtes motivé à apprendre le MQL5.
- Vous possédez une connexion internet de qualité pour faire du partage d'écran.
- Vous possédez un PC qui ne bugge pas.
- Nous sommes libres.
Concrètement ça signifie qu'il n'y a pas d'engagement, ni de votre part, ni de la mienne.
Nous sommes libres d’arrêter notre collaboration à tout instant sans avoir à se justifier.
- Il faut que l'on trouve des horaires compatibles avec nos emplois du temps.

Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#5 Message par Trader55 »

J'ai un projet de codage en MQL5 depuis que j'ai appris que :
- Les jours de MQL4 sont de plus en plus comptés
- Que depuis plus d'un an on peut à présent passer un ordre Sell et un ordre Buy (ce qui était interdit avant sur MQL5).

De ce fait, faudrait que je transcrive mes EA MQL4 en MQL5, que je prenne connaissance de la plateforme MT5, et de ses fameux backtests multipaires.

J'hésite à tout faire à partir de 0. Je commanderai bien, une prestation de transcription d'un EA afin de comprendre la mécanique, la structure.

Et toi tu as commencé comment ? Avec un bouquin ?

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#6 Message par Pierre8r »

Et toi tu as commencé comment ? Avec un bouquin ?
J'ai plus ou moins suivi ce cours :
http://www.videobourse.fr/forum-forex/v ... 16&t=15319
En définitive très très bien pour 10 €.
Mais il n'est plus disponible à la vente, je ne sais pas pourquoi.
J'ai acheté ce livre http://amzn.eu/d/5S2EjAU dont on m'a dit du bien, mais je ne l'ai jamais ouvert.
J'ai surtout regardé des exemples de codes sur https://www.mql5.com/en/articles en triant par best et en regardant ce qui m'inspirait comme :
https://www.mql5.com/en/articles/37
https://www.mql5.com/en/articles/100

Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#7 Message par Trader55 »

Ok, je viens d'installer une plateforme MT5, de chez Activtrades +compte demo.
C'est comme dans MQL4 il y a des petits exemples d'EA dont un vraiment bien fait MACD Sample.mq5

C'est vrai qu'on est pas trop perdu mais va falloir assimiler les class et la prog orientée objet...

sinon, pour acheter , c'est ainsi

if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))

Pour modifier c'est plus simple :
double sl=NormalizeDouble(m_symbol.Bid()-m_traling_stop,m_symbol.Digits());
double tp=m_position.TakeProfit();

Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#8 Message par Trader55 »


Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#9 Message par Trader55 »

Pierre8r a écrit :Bonjour,

J'ai le projet de coder en MQL5 le Portefeuille Permanent de Harry Browne sous la forme d'un Expert Advisor.
Cela me permettra de le tester avec des ETFs en ouvrant un compte démo Admiral.Invest
Backtester moi-même le Portefeuille Permanent de Harry Browne.
Tester la fonctionnalité backtest multi-produits de MetaTrader 5.
Pierre8r, je suis allé voir le portefeuiile de Harry et je ne comprends pas la relation entre ce portefeuille et un EA et encore moins le backtest.
Si j'ai bien compris, le portefeuiile est reparti en 4 classes d'actifs.

Et donc tu vas suivre cette repartition :
Those assets are (for US Investors) Stocks, Long Term Treasury Bonds, Treasury Money Market Funds and Gold. So, a 4-asset Perm Port might have VTI, TLT, SHY, and GLD.

VTI = Vanguard Total Stock Market ETF
TLT= iShares 20+ Year Treasury Bond ETF
SHY= Shares 1-3 Year Treasury Bond ETF
GLD= SPDR Gold Trust ETF

Bon avec ton compte demo de 100000 euros, tu vas donc acheter 25k de chaque, mais après ?, je ne comprends pas trop ce que va faire l'EA ?

Et pour tes BT, pareil, tu vas avoir les histo de ces 4 valeurs dans MT5 ?

Si tu pouvais exposer quelle est ton idée et ton projet ?

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#10 Message par Pierre8r »

Il faut bien débuter par quelque chose. :)

Code : Tout sélectionner

//+------------------------------------------------------------------+
//|                                         eaPermanentPortfolio.mq5 |
//|                                   Copyright 2018, Pierre Rougier |
//|                                    http://www.apprendre-mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Pierre Rougier"
#property link      "http://www.apprendre-mql5.com"
#property version   "1.00"

input  int  capital_dedicated_to_strategy;

input string stocks= "VTI";
input string bonds ="TLT";
input string cash = "SHY";
input string gold = "GLD";

int year_saved=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(isNewYear())
     {
      Rebalance();
     }

  }
//+------------------------------------------------------------------+
bool isNewYear()
  {

   MqlDateTime mql_datetime;
   TimeToStruct(iTime(_Symbol,_Period,0),mql_datetime);

   if(mql_datetime.year!=year_saved)
     {
      year_saved=mql_datetime.year;
      return true;
     }
   else
     {
      return false;
     }
  }
//+------------------------------------------------------------------+
void Rebalance()
  {
  }
//+------------------------------------------------------------------+
Et pour tes BT, pareil, tu vas avoir les histo de ces 4 valeurs dans MT5 ?
Ils sont disponibles en minutes chez Admiral Markets.
Oui GLD novembre 2004.
Et les autres avant 2002 ou 2001.

Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#11 Message par Trader55 »

Je ne comprends toujours pas le but de l'EA.
en fait, à part diviser ton capital en 4 et pour acheter les 4 classes d'actifs, mais que fait l'EA ?

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#12 Message par Pierre8r »

Trader55 a écrit :Je ne comprends toujours pas le but de l'EA.
en fait, à part diviser ton capital en 4 et pour acheter les 4 classes d'actifs, mais que fait l'EA ?
Comme indiquer dans un des liens du premier poste, il faut rééquilibrer chaque année.
Pas mal, surtout que l’approche est complètement passive (pas d’analyse des cycles, pas de recherche sur telle ou telle action,…). La seule action de l’investisseur est de rééquilibrer le portefeuille chaque année pour garder la répartition égale entre les 4 supports. Donc si vous commencez avec un portfeuille permanent et qu’un an plus tard vos actions ont pris 15%, mécaniquement leur poids dans le portefeuille va être de 27,7% (en supposant que les autres supports sont restés au même niveau). La seule action consistera donc à vendre 2,7% de votre portefeuille investi en actions et de le réinvestir à part égales pour retomber sur une répartition égale de 25% pour chaque support.

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#13 Message par Pierre8r »

Il y a encore beaucoup, beaucoup, beaucoup de boulot.
Pour aujourd'hui c'est terminé.

Code : Tout sélectionner

//+------------------------------------------------------------------+
//|                                         eaPermanentPortfolio.mq5 |
//|                                   Copyright 2018, Pierre Rougier |
//|                                    http://www.apprendre-mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Pierre Rougier"
#property link      "http://www.apprendre-mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

CTrade myTradingControlPanel;

input  int  capital_dedicated_to_strategy;

input string stocks= "VTI";
input string bonds ="TLT";
input string cash = "SHY";
input string gold = "GLD";

input int      magicNumber=12345;

int year_saved=0;
bool is_trades_already_open=false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MqlDateTime mql_datetime;
   TimeToStruct(iTime(_Symbol,_Period,0),mql_datetime);
   year_saved=mql_datetime.year;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(isNewYear())
     {
      if(!is_trades_already_open)
        {
         StartStrategy();
        }
      else
        {
         Rebalance();
        }
     }
  }
//+------------------------------------------------------------------+
bool isNewYear()
  {

   MqlDateTime mql_datetime;
   TimeToStruct(iTime(_Symbol,_Period,0),mql_datetime);

   if(mql_datetime.year!=year_saved)
     {
      year_saved=mql_datetime.year;
      return true;
     }
   else
     {
      return false;
     }
  }
//+------------------------------------------------------------------+
void StartStrategy()
  {

   int amount=capital_dedicated_to_strategy/4;

   OpenPosition(stocks,amount);
   OpenPosition(bonds,amount);
   OpenPosition(cash,amount);
   OpenPosition(gold,amount);

  }
//+------------------------------------------------------------------+
void Rebalance()
  {

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OpenPosition(string asset_class_type,int amount)
  {
/*
   myTradingControlPanel.PositionOpen(longTradesToFire[i],ORDER_TYPE_BUY,lotsLong[i],SymbolInfoDouble(longTradesToFire[i],SYMBOL_ASK),stopLossLevel,takeProfitLevel,"Buy Trade. Magic Number #"+(string) myTradingControlPanel.RequestMagic()); // Open a Buy (i.e. long) position

   if(myTradingControlPanel.ResultRetcode()==TRADE_RETCODE_PLACED || myTradingControlPanel.ResultRetcode()==TRADE_RETCODE_DONE) // Request is completed or order placed
     {
      isPositionOpen=true;
      tries=0;
      Print("Entry rules: A ",longTradesToFire[i]," Buy order has been successfully placed with Ticket#: ",myTradingControlPanel.ResultOrder());
     }
   else
     {
      Print("Entry rules: A ",longTradesToFire[i]," Buy order request could not be completed. Error: ",GetLastError());
     }
*/
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CheckOpenPositions()
  {
//totalProfitAndLoss=0;

// Loop through all open positions 
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      ulong ticketNumber=0;
      // This selects open position by the order they appear in our list of positions
      ticketNumber=PositionGetTicket(i);
      if(ticketNumber==0)
        {
         Print("Exit rules: Position exists but not selected. Error: ",GetLastError());
         ResetLastError();
         continue;
        }

      string symbol=PositionGetString(POSITION_SYMBOL);

      if(PositionGetInteger(POSITION_MAGIC)==magicNumber)
        {
         if(symbol==stocks)
           {

           }
         else if(symbol==bonds)
           {

           }
         else if(symbol==cash)
           {

           }
         else if(symbol==gold)
           {

           }
        }
     }

  };
//+------------------------------------------------------------------+

Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#14 Message par Trader55 »

C'est pas mal Pierre,

Il faudrait que tu commentes plus ton programme.

Si j'ai bien compris, l'achat initial / 4 fonctionne. Maintenant te reste à faire le calcul du "rebalance".

Puisque tu as un EA, tu pourrais maintenir l’équilibre chaque mois mais j'imagine que cela couterait des com ?

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Je suis en train de coder. Si vous souhaitez coder avec moi,

#15 Message par Pierre8r »

Je suis en train de coder.
Si vous souhaitez coder avec moi, ou me regarder coder en partage d'écran sous Skype ou Hangouts,
je suis dispo.
M'envoyer un e-mail pour me signaler que vous êtes intéressé.

Code : Tout sélectionner

//+------------------------------------------------------------------+
//|                                         eaPermanentPortfolio.mq5 |
//|                                   Copyright 2018, Pierre Rougier |
//|                                    http://www.apprendre-mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Pierre Rougier"
#property link      "http://www.apprendre-mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

CTrade myTradingControlPanel;

input  int  capital_dedicated_to_strategy;

input string stocks= "VTI";
input string bonds ="TLT";
input string cash = "SHY";
input string gold = "GLD";

input int      magicNumber=12345;

int year_saved=0;
bool is_trades_already_open=false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MqlDateTime mql_datetime;
   TimeToStruct(iTime(_Symbol,_Period,0),mql_datetime);
   year_saved=mql_datetime.year;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(isNewYear())
     {
      if(!is_trades_already_open)
        {
         StartStrategy();
        }
      else
        {
         Rebalance();
        }
     }
  }
//+------------------------------------------------------------------+
bool isNewYear()
  {

   MqlDateTime mql_datetime;
   TimeToStruct(iTime(_Symbol,_Period,0),mql_datetime);

   if(mql_datetime.year!=year_saved)
     {
      year_saved=mql_datetime.year;
      return true;
     }
   else
     {
      return false;
     }
  }
//+------------------------------------------------------------------+
void StartStrategy()
  {

   int amount=capital_dedicated_to_strategy/4;

   OpenPosition(stocks,amount);
   OpenPosition(bonds,amount);
   OpenPosition(cash,amount);
   OpenPosition(gold,amount);

  }
//+------------------------------------------------------------------+
void Rebalance()
  {

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OpenPosition(string asset_class_type,int amount)
  {
// Open a Buy (i.e. long) position
   myTradingControlPanel.PositionOpen(asset_class_type,ORDER_TYPE_BUY,amount,
                                      SymbolInfoDouble(asset_class_type,SYMBOL_ASK),
                                      0,0,"Buy Trade. Magic Number #"
                                      +(string) myTradingControlPanel.RequestMagic());
// Request is completed or order placed
   if(myTradingControlPanel.ResultRetcode()==TRADE_RETCODE_PLACED || myTradingControlPanel.ResultRetcode()==TRADE_RETCODE_DONE)
     {
      Print("Entry rules: A ",asset_class_type," Buy order has been successfully placed with Ticket#: ",myTradingControlPanel.ResultOrder());
     }
   else
     {
      Print("Entry rules: A ",asset_class_type," Buy order request could not be completed. Error: ",GetLastError());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CheckOpenPositions()
  {
   double current_value_stocks= 0;
   double current_value_bonds = 0;
   double current_value_cash = 0;
   double current_value_gold = 0;

// Loop through all open positions 
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      ulong ticketNumber=0;
      // This selects open position by the order they appear in our list of positions
      ticketNumber=PositionGetTicket(i);
      if(ticketNumber==0)
        {
         Print("Exit rules: Position exists but not selected. Error: ",GetLastError());
         ResetLastError();
         continue;
        }

      if(PositionGetInteger(POSITION_MAGIC)==magicNumber)
        {
         string symbol=PositionGetString(POSITION_SYMBOL);

         if(symbol==stocks)
           {
            current_value_stocks=current_value_stocks+PositionGetDouble(POSITION_PRICE_CURRENT);
           }
         else if(symbol==bonds)
           {
            current_value_bonds=current_value_bonds+PositionGetDouble(POSITION_PRICE_CURRENT);
           }
         else if(symbol==cash)
           {
            current_value_cash=current_value_cash+PositionGetDouble(POSITION_PRICE_CURRENT);
           }
         else if(symbol==gold)
           {
            current_value_gold=current_value_gold+PositionGetDouble(POSITION_PRICE_CURRENT);
           }
        }
     }

  };
//+------------------------------------------------------------------+

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#16 Message par Pierre8r »

J'essaie également de recruter sur www.MQL5.com
https://www.mql5.com/en/forum/289987

:D :D :D :D :D :D :D :D :D :D :D

Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#17 Message par Trader55 »

En fait j'ai des questions sur le code.

#include <Trade\Trade.mqh> C'est propre à MQL5, c'est la biblio ? C'est ce qui correspondait à <stdlib.mqh> dans MQL4 ?

CTrade myTradingControlPanel; A quoi correspond cette ligne ?

MqlDateTime mql_datetime;
TimeToStruct(iTime(_Symbol,_Period,0),mql_datetime);

C'est quoi ces deux lignes ?

Jeff719
VideoBourse family
Messages : 785
Inscription : 28 sept. 2015, 16:18

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#18 Message par Jeff719 »

Bah c'est pas spécifique de MT5 :
MqlDateTime c'est la struct DateTime
TimeToStruct ben ça fait ce que ça dit

Là c'est depuis MT5 (quoi qu'on peut le développer à la mano en MT4) :
CTrade myTradingControlPanel déclare une instance de la classe CTrade.

On voit que c'est pas fait par new donc l'alloc se fait à la compil (ou équivalent vu qu'on est en semi compilé).
Les informations présentées ne peuvent être considérées ni comme un conseil en investissement, ni comme une recommandation d'investissement. Il s'agit de commentaires généraux sur les marchés et de raisonnements que l'on peut tenir à leur sujet.

Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#19 Message par Trader55 »

@Pierre8,

les questions étaient pour toi ;)

Je t'imagine plus pédagogue :)

Merci

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#20 Message par Pierre8r »

@Trader55

Jeff719 a bien expliqué.
Je vais quant même donné mon grain de sel.

Si tu utilises la touche F1 sur CTrade, tu obtiens cette aide :
CTrade

CTrade is a class for easy access to the trade functions.

Description

CTrade class provides easy access to the trade functions.

Declaration



class CTrade : public CObject

etc...
Pour MqlDateTime même chose si tu utilises la touche F1.
ça te donne même un petit bout de code que tu peux lancer dans un script.

Code : Tout sélectionner

void OnStart() 
  { 
//--- 
   datetime date1=D'2008.03.01'; 
   datetime date2=D'2009.03.01'; 
  
   MqlDateTime str1,str2; 
   TimeToStruct(date1,str1); 
   TimeToStruct(date2,str2); 
   printf("%02d.%02d.%4d, day of year = %d",str1.day,str1.mon, 
          str1.year,str1.day_of_year); 
   printf("%02d.%02d.%4d, day of year = %d",str2.day,str2.mon, 
          str2.year,str2.day_of_year); 
  } 
/*  Result: 
   01.03.2008, day of year = 60 
   01.03.2009, day of year = 59 
*/

Jeff719
VideoBourse family
Messages : 785
Inscription : 28 sept. 2015, 16:18

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#21 Message par Jeff719 »

Oups, désolé. :oops:

Ceci dit, le sujet étant le passage à MQL5, les questions relatives à la méconnaissance de MQL4 risquent de considérablement compliquer le schmilblick. :lol:

Ah ! On a du cliquer en même temps, Pierre.

Oui tu as raison, en effet faut pas hésiter face à un bout de code saugrenu à cliquer F1.

Parfois la doc est critiquable mais c'est mieux que rien. Souvent ça suffit à comprendre.

Ceci dit et pour en revenir au début de la file, connaitre le C++ aide beaucoup pour appréhender Mql5. Sinon ça doit quand même sembler abscons.

On pourrait m'opposer que quitte à se mettre à l'objet, pourquoi pas avec MQL5 (voir tout simplement avec les releases 600 de MQL4 actives depuis plus de 3 ans) ? Dans l'environnement du passionné de trading, c'est quand même plus motivant ?

Sauf que la programmation objet n'est pas si simple, si accessible. C'est quand même un truc de geeks. Dans ce contexte le milieu du C++ comporte des universitaires de grand talent produisant des concepts, de la doc et de la pédagogie de haut niveau : Kernighan et Rithchie, Bjarne Stroustrup. Ces mecs là conçoivent l'usine à gaz puis font de la doc tellement limpide que vous vous en retrouvez sur le cul de vous trouver si intelligent.

Les ruskofs c'est le contraire. Vous en avez marre de vous trouver aussi con de rien comprendre à leur doc foireuse... :lol:
Les informations présentées ne peuvent être considérées ni comme un conseil en investissement, ni comme une recommandation d'investissement. Il s'agit de commentaires généraux sur les marchés et de raisonnements que l'on peut tenir à leur sujet.

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Je vais essayer de coder aujourd'hui jeudi 15 novembre jusqu

#22 Message par Pierre8r »

Je vais essayer de coder aujourd'hui jeudi 15 novembre jusqu'à 11H30.
Si vous souhaitez coder avec moi, ou me regarder coder en partage d'écran sous Skype ou Hangouts,
je suis dispo.
Mon pseudo Skype Pierre8r
Préciser que c'est pour MQL5.

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#23 Message par Pierre8r »

Code : Tout sélectionner

//+------------------------------------------------------------------+
//|                                         eaPermanentPortfolio.mq5 |
//|                                   Copyright 2018, Pierre Rougier |
//|                                    http://www.apprendre-mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Pierre Rougier"
#property link      "http://www.apprendre-mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

CTrade myTradingControlPanel;

input  int  capital_dedicated_to_strategy=10000;

input string stocks= "VTI";
input string bonds ="TLTUS";
input string cash = "SHY";
input string gold = "GLD";

input int      magicNumber=12345;

int year_saved=0;
bool is_trades_already_open=false;

double total_current_value=0;
double current_value_stocks= 0;
double current_value_bonds = 0;
double current_value_cash = 0;
double current_value_gold = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MqlDateTime mql_datetime;
   TimeToStruct(iTime(_Symbol,_Period,0),mql_datetime);
   year_saved=mql_datetime.year;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(isNewYear())
     {
      if(!is_trades_already_open)
        {StartStrategy();}
      else
        {Rebalance();}
     }
  }
//+------------------------------------------------------------------+
bool isNewYear()
  {

   MqlDateTime mql_datetime;
   TimeToStruct(iTime(_Symbol,_Period,0),mql_datetime);

   if(mql_datetime.year!=year_saved)
     {
      year_saved=mql_datetime.year;
      return true;
     }
   else
     {return false;}
  }
//+------------------------------------------------------------------+
void StartStrategy()
  {
   int amount=capital_dedicated_to_strategy/4;

   OpenPosition(stocks,amount);
   OpenPosition(bonds,amount);
   OpenPosition(cash,amount);
   OpenPosition(gold,amount);

  }
//+------------------------------------------------------------------+
void Rebalance()
  {
   ComputeValuePositionsByAssetsClass();
   total_current_value=current_value_stocks+current_value_bonds+current_value_cash+current_value_gold;
   double target_value=total_current_value/4;

  }
//+------------------------------------------------------------------+
void OpenPosition(string asset_class_type,int amount)
  {
   double  ask=SymbolInfoDouble(asset_class_type,SYMBOL_ASK);
   double   quantity_to_buy=NormalizeDouble((amount/ask),0);

// Open a Buy (i.e. long) position
   myTradingControlPanel.PositionOpen(asset_class_type,ORDER_TYPE_BUY,quantity_to_buy,
                                      0,
                                      //                                      SymbolInfoDouble(asset_class_type,SYMBOL_ASK),
                                      0,0,"Buy Trade. Magic Number #"
                                      +(string) myTradingControlPanel.RequestMagic());
// Request is completed or order placed
   if(myTradingControlPanel.ResultRetcode()==TRADE_RETCODE_PLACED || myTradingControlPanel.ResultRetcode()==TRADE_RETCODE_DONE)
     {
      Print("Entry rules: A ",asset_class_type," Buy order has been successfully placed with Ticket#: ",myTradingControlPanel.ResultOrder());
     }
   else
     {
      Print("Entry rules: A ",asset_class_type," Buy order request could not be completed. Error: ",GetLastError());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ComputeValuePositionsByAssetsClass()
  {
// Loop through all open positions 
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      ulong ticketNumber=0;
      // This selects open position by the order they appear in our list of positions
      ticketNumber=PositionGetTicket(i);
      if(ticketNumber==0)
        {
         Print("Exit rules: Position exists but not selected. Error: ",GetLastError());
         ResetLastError();
         continue;
        }

      if(PositionGetInteger(POSITION_MAGIC)==magicNumber)
        {
         string symbol=PositionGetString(POSITION_SYMBOL);

         if(symbol==stocks)
           {
            current_value_stocks=current_value_stocks+PositionGetDouble(POSITION_PRICE_CURRENT);
           }
         else if(symbol==bonds)
           {
            current_value_bonds=current_value_bonds+PositionGetDouble(POSITION_PRICE_CURRENT);
           }
         else if(symbol==cash)
           {
            current_value_cash=current_value_cash+PositionGetDouble(POSITION_PRICE_CURRENT);
           }
         else if(symbol==gold)
           {
            current_value_gold=current_value_gold+PositionGetDouble(POSITION_PRICE_CURRENT);
           }
        }
     }

  };
//+------------------------------------------------------------------+

Avatar de l’utilisateur
Trader55
VideoBourse family
Messages : 1280
Inscription : 21 sept. 2014, 21:30

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#24 Message par Trader55 »

Je vais en profiter pour ouvrir un compte demo chez admiral , comme toi.
Et faire tourner le code et les backtests

tu as pris quoi comme compte ? Et pour le code tu as terminé ou non ?

Avatar de l’utilisateur
Pierre8r
Membre assidu
Messages : 276
Inscription : 28 sept. 2013, 07:54

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

#25 Message par Pierre8r »

Trader55 a écrit :Je vais en profiter pour ouvrir un compte demo chez admiral , comme toi.
Et faire tourner le code et les backtests

tu as pris quoi comme compte ? Et pour le code tu as terminé ou non ?
Il faut prendre un compte demo Admiral.Invest.

Le code n'est pas terminé.
Je vais essayé de travailler dessus demain, mais ce n'est pas sur.
Si j'ai du temps je continu de travailler dessus jusqu'à dimanche.
La semaine prochaine je ne travaille pas dessus avant vendredi 23 suivant mes disponibilités.
Pièces jointes
Types de comptes de trading - Comparaison de nos types de comptes forex - Admiral Markets - Google Chrome.png - Paint.jpg

Répondre