Page 1 sur 3

Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 10 nov. 2018, 16:11
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.

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 10 nov. 2018, 17:50
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.

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 10 nov. 2018, 18:24
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.

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 10 nov. 2018, 18:29
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.

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 10 nov. 2018, 18:45
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 ?

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 10 nov. 2018, 19:52
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

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 10 nov. 2018, 23:29
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();

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 11 nov. 2018, 13:03
par Trader55

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 12 nov. 2018, 13:39
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 ?

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 12 nov. 2018, 14:08
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.

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 12 nov. 2018, 16:04
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 ?

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 12 nov. 2018, 17:34
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.

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 12 nov. 2018, 17:36
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)
           {

           }
        }
     }

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

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 12 nov. 2018, 18:28
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 ?

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

Publié : 14 nov. 2018, 16:21
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);
           }
        }
     }

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

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 14 nov. 2018, 17:37
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

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 14 nov. 2018, 18:42
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 ?

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 14 nov. 2018, 19:17
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é).

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 14 nov. 2018, 19:23
par Trader55
@Pierre8,

les questions étaient pour toi ;)

Je t'imagine plus pédagogue :)

Merci

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 14 nov. 2018, 20:34
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 
*/

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 14 nov. 2018, 20:35
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:

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

Publié : 15 nov. 2018, 10:30
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.

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 15 nov. 2018, 11:29
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);
           }
        }
     }

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

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 15 nov. 2018, 16:04
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 ?

Re: Coder en MQL5 le Portefeuille Permanent de Harry Browne

Publié : 15 nov. 2018, 18:04
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.