ProRealCode - Trading & Coding with ProRealTime™
//------------------------------------------------------------------
#property link ""
extern double
Lots = 0.1; // Assign Fixed Lot Size to be traded,AutoLotSize must be false
extern int
MaxUnits = 1, //Maximum units to trade per Currency Pair
MagicNumber = 11282,
EntryLookBack = 55, //Bars to lookback in calculating breakout prices
ExitLookBack = 20, //Bars to lookback in calculating exit points
ATRPeriod = 20;
extern double
SLMultiple = 2.5, //Multiply ATR by this to calculate StopLoss
ReEntryMultiple = 0.5; //Multiple ATR by this to calculate Re Entry Point
extern bool
ATRBreakEven = false; //if set to true SL will be moved to break even level
extern double
BreakEvenMultiple = 2.5;
extern bool
LockProfit = true;
extern double
PipLockinStart = 50, //$ amount to start lock in
LockinPercent = 30;
//-------------------GLOBAL VARS
bool
Revenge = false;
double
RevengeSL = 3;
static int
TimeFrame;
double LastEMAX,
LastEMIN,
LastXMAX,
LastXMIN,
LastOpen,
PTLocked,
PTPercent,
spread,
tickvalue,
LastSL;
double
EMAX,
EMIN,
trueEMAX,
trueEMIN,
XMAX,
N,
XMIN;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----------------------- GENERATE MAGIC NUMBER AND TICKET COMMENT
MagicNumber = subGenerateMagicNumber(MagicNumber, Symbol(), Period());
tickvalue = MarketInfo(Symbol(),MODE_TICKVALUE);
subPrintDetails();
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----------------------- PREVENT RE-COUNTING WHILE USER CHANGING TIME FRAME
TimeFrame=Period();
return(0);
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//-----------------SET VARIABLE VALUES
int Ehighest_bar=Highest(NULL, 0, MODE_HIGH, EntryLookBack, 1);
EMAX=NormalizeDouble (iHigh(NULL, 0, Ehighest_bar),Digits);
int Elowest_bar=Lowest(NULL, 0, MODE_LOW, EntryLookBack, 1);
EMIN=NormalizeDouble (iLow(NULL, 0, Elowest_bar),Digits);
int Xhighest_bar=Highest(NULL, 0, MODE_HIGH, ExitLookBack, 1);
XMAX=NormalizeDouble (iHigh(NULL, 0, Xhighest_bar),Digits);
int Xlowest_bar=Lowest(NULL, 0, MODE_LOW, ExitLookBack, 1);
XMIN=NormalizeDouble (iLow(NULL, 0, Xlowest_bar),Digits);
N = NormalizeDouble ((iATR(NULL,0,20,1)),Digits);
LastOpen = subLastOpenPrice();
LastSL = subLastSLPrice();
tickvalue = MarketInfo(Symbol(),MODE_TICKVALUE);
subPrintDetails();
spread = MarketInfo(Symbol(),MODE_SPREAD);
// Unit=(AccountBalance()/100/N/Point*MarketInfo(Symbol(),MODE_TICKVALUE));
double BStopLossLevel, SStopLossLevel;
int BuyStopOrder = 0, SellStopOrder = 0, BuyOrder = 0, SellOrder = 0;
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
double NSL = NormalizeDouble( N*RevengeSL, Digits );
//-----------------TRAILING TOTAL PROFITS WITH REVENGE
if(LockProfit)
{
PTPercent = NormalizeDouble(subPipProfitTotal()*(LockinPercent/100),0);
if(subPipProfitTotal()>PipLockinStart)
{
if(PTPercent>PTLocked)
{
PTLocked = PTPercent;
}
}
if(!Revenge)
{
if(PTLocked>0)
{
if(PTLocked>=subPipProfitTotal())
{
subCloseOrder();
PTLocked = 0;
}
}
}
if(Revenge)
{
if(subOrderType()==OP_SELL){
if(PTLocked>0){
if(PTLocked>=subPipProfitTotal())
{
subCloseOrder();
PTLocked = 0;
if(OrderSend(Symbol(),OP_BUY,Lots,Ask,3,OrderOpenPrice()-NSL,0,"DocSniper EA",MagicNumber,0,Green)<0) { Print( "OrderOpen Error #", GetLastError() ); return(-1); } } } } if(subOrderType()==OP_BUY){ if(PTLocked>0){
if(PTLocked>=subPipProfitTotal())
{
subCloseOrder();
PTLocked = 0;
if(OrderSend(Symbol(),OP_SELL,Lots,Bid,3,OrderOpenPrice()+NSL,0,"DocSniper EA",MagicNumber,0,Green)<0) { Print( "OrderOpen Error #", GetLastError() ); return(-1); } } } } } } double Unit = Lots; for ( int z = _OrdersTotal - 1; z >= 0; z -- )
{
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
continue;
}
if ( OrderSymbol() != Symbol() ) continue;
if ( OrderMagicNumber() != MagicNumber ) continue;
switch ( OrderType() )
{
case OP_BUY: BuyOrder = OrderTicket(); break;
case OP_SELL: SellOrder = OrderTicket(); break;
case OP_BUYSTOP: BuyStopOrder = OrderTicket(); break;
case OP_SELLSTOP: SellStopOrder = OrderTicket(); break;
}
}
//-----------------------PENDING ORDERS PROCESS-----------------+
if(subTotalOpenTrade()<1)
{ PTLocked = 0;
LastXMIN = 0;
LastXMAX = 9999999;
BStopLossLevel = NormalizeDouble( EMAX - N*SLMultiple, Digits );
SStopLossLevel = NormalizeDouble( EMIN + N*SLMultiple, Digits );
double Spread = NormalizeDouble(spread*Point,Digits);
string Modify1 = "none";
string Modify2 = "none";
trueEMAX = EMAX + Spread;
trueEMIN = EMIN - Spread;
if((LastEMAX != trueEMAX)||(BuyStopOrder<1)) { if (BuyStopOrder>0)
{
int cnt;
int total = subTotalBuyStopTrade();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
BuyStopOrder = OrderTicket();
}
OrderDelete(BuyStopOrder);
}
BuyStopOrder = 0;
}
if(subTotalBuyStopTrade()<1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,Unit,trueEMAX,6,BStopLossLevel,0,"TURTLE POWER",MagicNumber,0,Green)<0)
{
Print( "OrderSend Error #", GetLastError() );
return(-1);
}
LastEMAX = trueEMAX;
double BuyPrice = LastEMAX;
}
}
if((LastEMIN != trueEMIN)||(SellStopOrder<1)) { if (SellStopOrder>0)
{
total = subTotalSellStopTrade();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
SellStopOrder = OrderTicket();
}
OrderDelete(SellStopOrder);
}
SellStopOrder = 0;
}
if(subTotalSellStopTrade()<1)
{
if (OrderSend(Symbol(),OP_SELLSTOP,Unit,trueEMIN,6,SStopLossLevel,0,"TURTLE POWER",MagicNumber,0,Green)<0) { Alert( "OrderSend Error #", GetLastError() ); return(-1); } LastEMIN = trueEMIN; double SellPrice = LastEMIN; } } } //-----------------------------------------------------+ //$$$$$$$$$$$$$$$$(OPEN BUY PROCESS)$$$$$$$$$$$$$$$$$$$+ //-----------------------------------------------------+ if(BuyOrder>0)
{
if (SellStopOrder>0)
{
if ( !OrderDelete( SellStopOrder ) )
{
Alert( "OrderDelete Error #", GetLastError() );
return(-1);
}
}
LastOpen = subLastOpenPrice();
//-------------PENDING REENTRY PROCESS
total = subTotalOpenTrade();
if(total<MaxUnits)
{
double PendingTotal = subTotalBuyStopTrade();
if(PendingTotal<1) { BuyPrice = NormalizeDouble((LastOpen+N*ReEntryMultiple),Digits); double SL = NormalizeDouble(BuyPrice - N*SLMultiple, Digits ); if(BuyPrice>Bid){
if (OrderSend(Symbol(),OP_BUYSTOP,Unit,BuyPrice,6,SL,0,"TURTLE POWER",MagicNumber,0,Green)<0) { Print( BuyPrice+"OrderSend Error #", GetLastError() ); return(-1); } LastOpen = subLastOpenPrice(); } } } //-----------MODIFY STOPS AFTER REENTRY LastOpen = subLastOpenPrice(); if((total>1)&&(XMIN<LastOpen))
{ LastOpen = subLastOpenPrice();
BStopLossLevel = NormalizeDouble(LastOpen - N*SLMultiple, Digits );
total = OrdersTotal();
for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if ( BStopLossLevel > OrderStopLoss()|| OrderStopLoss() <= 0.0 )
{
if ( !OrderModify( OrderTicket(), OrderOpenPrice(), BStopLossLevel,OrderTakeProfit(), OrderExpiration() ) )
{
Print( "OrderModify Error #", GetLastError() );
return(-1);
}
return(0);
}
}
}
}
LastOpen = subLastOpenPrice();
//-----------BREAK EVEN AFTER PIPS PROCESS
if((ATRBreakEven)&&(XMIN<LastOpen)) { double BreakEvenPrice = NormalizeDouble(LastOpen + N*BreakEvenMultiple,Digits); if(Bid > BreakEvenPrice){
for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if ( LastOpen > OrderStopLoss()|| OrderStopLoss() <= 0.0 ) { if ( !OrderModify( OrderTicket(), OrderOpenPrice(), LastOpen,OrderTakeProfit(), OrderExpiration() ) ) { Print( "OrderModify Error #", GetLastError() ); return(-1); } } } } Modify2="done"; } } //-----------TRAILING STOP PROCESS LastSL = subLastSLPrice(); total = subTotalOpenTrade(); if(total>1)
{
if(LastSL < XMIN)
{
total = OrdersTotal();
for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if ( !OrderModify( OrderTicket(), OrderOpenPrice(), XMIN,OrderTakeProfit(), OrderExpiration() ) ) { Print( "OrderModify Error #", GetLastError() ); return(-1); } } } LastSL = subLastSLPrice(); } } //+----------END OF TRAILING STOP PROCESS } //-----------------------------------------------------+ //$$$$$$$$$$$$$$$(OPEN SELL PROCESS)$$$$$$$$$$$$$$$$$$$+ //-----------------------------------------------------+ if(SellOrder>0)
{
if (BuyStopOrder>0)
{
if ( !OrderDelete( BuyStopOrder ) )
{
Alert( "OrderDelete Error #", GetLastError() );
return(-1);
}
}
LastOpen = subLastOpenPrice();
//-------------PENDING REENTRY PROCESS
total = subTotalOpenTrade();
if(total<MaxUnits)
{
PendingTotal = subTotalSellStopTrade();
if(PendingTotal<1)
{
SellPrice = NormalizeDouble((LastOpen-N*ReEntryMultiple),Digits);
SL = NormalizeDouble(SellPrice + N*SLMultiple, Digits );
if(SellPrice<Bid){
if (OrderSend(Symbol(),OP_SELLSTOP,Unit,SellPrice,6,SL,0,"TURTLE POWER",MagicNumber,0,Green)<0) { Print( BuyPrice+"OrderSend Error #", GetLastError() ); return(-1); } LastOpen = subLastOpenPrice(); } } } //-----------MODIFY STOPS AFTER REENTRY LastOpen = subLastOpenPrice(); if((total>1)&&(XMAX>LastOpen))
{
SStopLossLevel = NormalizeDouble(LastOpen + N*SLMultiple, Digits );
total = OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if ( SStopLossLevel < OrderStopLoss()|| OrderStopLoss() <= 0.0 ) { if ( !OrderModify( OrderTicket(), OrderOpenPrice(), SStopLossLevel,OrderTakeProfit(), OrderExpiration() ) ) { Print( "OrderModify Error #", GetLastError() ); return(-1); } return(0); } } } } //-----------BREAK EVEN AFTER PIPS PROCESS LastOpen = subLastOpenPrice(); if((ATRBreakEven)&&(XMAX>LastOpen)&&(total==MaxUnits))
{ total = OrdersTotal();
BreakEvenPrice = NormalizeDouble(LastOpen - N*BreakEvenMultiple,Digits);
if(Bid < BreakEvenPrice){
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if ( LastOpen < OrderStopLoss()|| OrderStopLoss() <= 0.0 )
{
if ( !OrderModify( OrderTicket(), OrderOpenPrice(), LastOpen,OrderTakeProfit(), OrderExpiration() ) )
{
Print( "OrderModify Error #", GetLastError() );
return(-1);
}
}
}
}
}
}
//-----------TRAILING STOP PROCESS
LastSL = subLastSLPrice();
if(XMAX<=LastOpen) { if(LastSL > XMAX)
{
total = OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if ( !OrderModify( OrderTicket(), OrderOpenPrice(), XMAX,OrderTakeProfit(), OrderExpiration() ) )
{
Print( "OrderModify Error #", GetLastError() );
return(-1);
}
}
}
LastSL = subLastSLPrice();
}
}
//+----------END OF TRAILING STOP PROCESS
}
//----
return(0);
}
//+--------------------------END OF PROGRAM--------------------------+
//----------------------- GENERATE MAGIC NUMBER BASE ON SYMBOL AND TIME FRAME FUNCTION
int subGenerateMagicNumber(int MagicNumber, string symbol, int timeFrame)
{
int isymbol = 0;
if (symbol == "EURUSD") isymbol = 1;
else if (symbol == "GBPUSD") isymbol = 2;
else if (symbol == "USDJPY") isymbol = 3;
else if (symbol == "USDCHF") isymbol = 4;
else if (symbol == "AUDUSD") isymbol = 5;
else if (symbol == "USDCAD") isymbol = 6;
else if (symbol == "EURGBP") isymbol = 7;
else if (symbol == "EURJPY") isymbol = 8;
else if (symbol == "EURCHF") isymbol = 9;
else if (symbol == "EURAUD") isymbol = 10;
else if (symbol == "EURCAD") isymbol = 11;
else if (symbol == "GBPUSD") isymbol = 12;
else if (symbol == "GBPJPY") isymbol = 13;
else if (symbol == "GBPCHF") isymbol = 14;
else if (symbol == "GBPAUD") isymbol = 15;
else if (symbol == "GBPCAD") isymbol = 16;
else isymbol = 17;
if(isymbol<10) MagicNumber = MagicNumber * 10;
return (StrToInteger(StringConcatenate(MagicNumber, isymbol, timeFrame)));
}
//----------------------- PRINT COMMENT FUNCTION
void subPrintDetails()
{
string sComment = "";
string sp = "-------------------------------------------------------------\n";
string NL = "\n";
sComment = sp;
sComment = sComment + sp;
sComment = sComment + "BULL ENTRY= " + DoubleToStr(EMAX,4) + " | ";
sComment = sComment + "BULL EXIT= " + DoubleToStr(XMIN,4) + " | ";
sComment = sComment + NL;
sComment = sComment + sp;
sComment = sComment + "BEAR ENTRY= " + DoubleToStr(EMIN,4) + " | ";
sComment = sComment + "BEAR EXIT= " + DoubleToStr(XMAX,4) + " | ";
sComment = sComment + NL;
sComment = sComment + sp;
sComment = sComment + "ATR =" + DoubleToStr(N,4) + " | ";
sComment = sComment + "Spread =" + DoubleToStr(spread,4) + " | ";
sComment = sComment + "tickvalue =" + DoubleToStr(tickvalue,4) + " | ";
sComment = sComment + NL;
sComment = sComment + sp;
sComment = sComment + "Total Pips= " +DoubleToStr(subPipProfitTotal(),0) + " | ";
sComment = sComment + "Pips Locked in= " + DoubleToStr(PTLocked,0) + " | ";
sComment = sComment + "T.P.Percent =" + DoubleToStr(PTPercent,4) + " | ";
sComment = sComment + NL;
sComment = sComment + sp;
Comment(sComment);
}
//----------COUNT OPEN TRADES------------------+
int subTotalOpenTrade()
{
int
cnt,
total = 0;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if((OrderType()==OP_SELL||OrderType()==OP_BUY) &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber) total++;
}
return(total);
}
//----------GET LASt OPENED PRICE------------------+
double subLastOpenPrice()
{
int
cnt,
total = 0;
double OpenPrice;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if((OrderType()==OP_SELL||OrderType()==OP_BUY) &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
OpenPrice = OrderOpenPrice();
}
return(OpenPrice);
}
//----------GET LASt SL PRICE------------------+
double subLastSLPrice()
{
int
cnt,
total = 0;
double SLPrice;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if((OrderType()==OP_SELL||OrderType()==OP_BUY) &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
SLPrice = OrderStopLoss();
}
return(SLPrice);
}
//----------COUNT BUYSTOP ORDERS---------------+
int subTotalBuyStopTrade()
{
int
cnt,
total = 0;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUYSTOP&&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber) total++;
}
return(total);
}
//-----------COUNT SELLSTOP ORDERS-------------+
int subTotalSellStopTrade()
{
int
cnt,
total = 0;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_SELLSTOP&&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber) total++;
}
return(total);
}
//----------COUNT OPEN TRADES------------------+
double subPipProfitTotal()
{
int
cnt,
total = 0;
tickvalue = MarketInfo(Symbol(),MODE_TICKVALUE);
double TotalProfit = 0;
for(cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if((OrderType()==OP_SELL||OrderType()==OP_BUY) && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { double PipProfit = (OrderProfit()/OrderLots()/tickvalue); TotalProfit = TotalProfit+PipProfit; } } return(TotalProfit); } //----------------------- CLOSE ORDER FUNCTION void subCloseOrder() { int cnt, total = 0, ticket = 0, err = 0, c = 0; total = OrdersTotal(); for(cnt=total-1;cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
switch(OrderType())
{
case OP_BUY :
for(c=0;c<10;c++) { ticket=OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); err=GetLastError(); if(err==0) { if(ticket>0) break;
}
else
{
if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
if(ticket>0) break;
}
}
}
break;
case OP_SELL :
for(c=0;c<10;c++) { ticket=OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); err=GetLastError(); if(err==0) { if(ticket>0) break;
}
else
{
if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
if(ticket>0) break;
}
}
}
break;
case OP_BUYLIMIT :
case OP_BUYSTOP :
case OP_SELLLIMIT:
case OP_SELLSTOP :
OrderDelete(OrderTicket());
}
}
}
}
//----------GET ORDER TYPE
int subOrderType()
{
int
cnt,
total = 0;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
total = OrderType();
}
return(total);
}
Ciao, pensi che sia un modo corretto per parlare con qualcuno? Ci sono dei veri umani dietro il messaggio, non lo sai?
Per favore, la prossima volta usa un linguaggio comprensibile per gli utenti quando chiedi una conversione del codice.
E segui le semplici regole in questa pagina: https://www.prorealcode.com/free-code-conversion/
Good morning Nicolas thanks for your intervention, it was not my intention to lack compared to anyone indeed I really appreciate your work I do a lot of the various interventions in this forum. I followed the procedure indicated on the page https://www.prorealcode.com/free-code-conversion/
but it was published this way.
Maybe I was wrong with something?
Thank you
Per favore usa l’italiano nel forum italiano. Grazie.
Scusate ma devo ancora abituarmi al forum, ho spesso google translate attivo e mi confonde.
Non riesco a capire se uso il forum in italiano o no. Grazie per l’osservazione.
Ad ogni modo, appena rivisto il codice, preferirei ottenere il file .mq4 perché il copia / incolla ha incasinato tutto il codice ed è molto difficile leggerlo ora ..
Quindi per favore condividi il file .mq4 nel tuo prossimo post, così sarò in grado di valutare se la conversione è possibile. Grazie.
ok grazie
Convert EA code from Metatrader MT4 to ProOrder
This topic contains 7 replies,
has 3 voices, and was last updated by coscar
7 years, 2 months ago.
| Forum: | ProOrder: Trading Automatico & Backtesting |
| Language: | Italian |
| Started: | 01/08/2019 |
| Status: | Active |
| Attachments: | 1 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.