From e317e4c33070dc5543ebd4fed09f505cd1297d0a Mon Sep 17 00:00:00 2001 From: Pierre8rTeam Date: Wed, 14 Mar 2018 11:26:36 +0100 Subject: [PATCH] commit [14/03/2018] --- Experts/Articles/481.zip | Bin 0 -> 5266 bytes Experts/Articles/481/ctrade_sample_ea.mq5 | 393 +++++++++++++++++ Experts/Articles/481/demo_caccountinfo.mq5 | 69 +++ Experts/Articles/481/demo_csymbolinfo.mq5 | 69 +++ Experts/Articles/481/demo_ctrade.mq5 | 49 +++ Experts/Downloads/Exp_GStopLoss.mq5 | Bin 0 -> 25266 bytes .../Downloads/Opening_and_ilosing_on_time.mq5 | Bin 0 -> 14936 bytes Experts/Downloads/RobotPowerM5 meta4V12.mq5 | Bin 0 -> 24574 bytes Experts/TradePad/classchart.mqh | 297 +++++++++++++ Experts/TradePad/classcontrolbutton.mqh | 118 +++++ Experts/TradePad/classsymbolbutton.mqh | 105 +++++ Experts/TradePad/classtradepad.mqh | 414 ++++++++++++++++++ Experts/TradePad/tradepad_sample.mq5 | 120 +++++ Indicators/Downloads/Macd FRAMA.mq5 | Bin 0 -> 15720 bytes Profiles/Charts/Default/chart01.chr | Bin 39022 -> 0 bytes Profiles/Charts/Default/chart02.chr | Bin 19600 -> 0 bytes Profiles/Charts/Default/chart03.chr | Bin 25378 -> 0 bytes Profiles/Charts/Default/chart04.chr | Bin 26646 -> 0 bytes 18 files changed, 1634 insertions(+) create mode 100644 Experts/Articles/481.zip create mode 100644 Experts/Articles/481/ctrade_sample_ea.mq5 create mode 100644 Experts/Articles/481/demo_caccountinfo.mq5 create mode 100644 Experts/Articles/481/demo_csymbolinfo.mq5 create mode 100644 Experts/Articles/481/demo_ctrade.mq5 create mode 100644 Experts/Downloads/Exp_GStopLoss.mq5 create mode 100644 Experts/Downloads/Opening_and_ilosing_on_time.mq5 create mode 100644 Experts/Downloads/RobotPowerM5 meta4V12.mq5 create mode 100644 Experts/TradePad/classchart.mqh create mode 100644 Experts/TradePad/classcontrolbutton.mqh create mode 100644 Experts/TradePad/classsymbolbutton.mqh create mode 100644 Experts/TradePad/classtradepad.mqh create mode 100644 Experts/TradePad/tradepad_sample.mq5 create mode 100644 Indicators/Downloads/Macd FRAMA.mq5 delete mode 100644 Profiles/Charts/Default/chart01.chr delete mode 100644 Profiles/Charts/Default/chart02.chr delete mode 100644 Profiles/Charts/Default/chart03.chr delete mode 100644 Profiles/Charts/Default/chart04.chr diff --git a/Experts/Articles/481.zip b/Experts/Articles/481.zip new file mode 100644 index 0000000000000000000000000000000000000000..42df5e1d1f1d5829c5b43c0ddf2c23d124b17797 GIT binary patch literal 5266 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 +#property description "This Expert Advisor shows some examples of working " +#property description "with CTrade class. Its functions are not called." + +//--- object for performing trade operations +CTrade trade; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- set MagicNumber for your orders identification + int MagicNumber=123456; + trade.SetExpertMagicNumber(MagicNumber); +//--- set available slippage in points when buying/selling + int deviation=10; + trade.SetDeviationInPoints(deviation); +//--- order execution mode + trade.SetTypeFilling(ORDER_FILLING_RETURN); +//--- logging mode: it would be better not to declare this method at all, the class will set the best mode on its own + trade.LogLevel(1); +//--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend() + trade.SetAsyncMode(true); +//--- + return(0); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + + } +//--- Buy sample +//+------------------------------------------------------------------+ +//| Buying a specified volume at the current symbol | +//+------------------------------------------------------------------+ +void BuySample1() + { +//--- 1. example of buying at the current symbol + if(!trade.Buy(0.1)) + { + //--- failure message + Print("Buy() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//+------------------------------------------------------------------+ +//| Buying with specified volume and symbol | +//+------------------------------------------------------------------+ +void BuySample2() + { +//--- 2. example of buying at the specified symbol + if(!trade.Buy(0.1,"GBPUSD")) + { + //--- failure message + Print("Buy() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//+------------------------------------------------------------------+ +//| Buying with specifying all order parameters | +//+------------------------------------------------------------------+ +void BuySample3() + { +//--- 3. example of buying at the specified symbol with specified SL and TP + double volume=0.1; // specify a trade operation volume + string symbol="GBPUSD"; //specify the symbol, for which the operation is performed + int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places + double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point + double bid=SymbolInfoDouble(symbol,SYMBOL_BID); // current price for closing LONG + double SL=bid-1000*point; // unnormalized SL value + SL=NormalizeDouble(SL,digits); // normalizing Stop Loss + double TP=bid+1000*point; // unnormalized TP value + TP=NormalizeDouble(TP,digits); // normalizing Take Profit +//--- receive the current open price for LONG positions + double open_price=SymbolInfoDouble(symbol,SYMBOL_ASK); + string comment=StringFormat("Buy %s %G lots at %s, SL=%s TP=%s", + symbol,volume, + DoubleToString(open_price,digits), + DoubleToString(SL,digits), + DoubleToString(TP,digits)); + if(!trade.Buy(volume,symbol,open_price,SL,TP,comment)) + { + //--- failure message + Print("Buy() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//--- Examples for placing a limit order +//+------------------------------------------------------------------+ +//| Placing a limit order at the current symbol | +//+------------------------------------------------------------------+ +void BuyLimit_Sample1() + { +//--- 1. example of placing a Buy Limit pending order + string symbol="GBPUSD"; // specify the symbol, at which the order is placed + int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places + double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point + double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price + double price=1000*point; // unnormalized open price + price=NormalizeDouble(price,digits); // normalizing open price +//--- everything is ready, sending a Buy Limit pending order to the server + if(!trade.BuyLimit(0.1,price)) + { + //--- failure message + Print("BuyLimit() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("BuyLimit() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//+------------------------------------------------------------------+ +//| Placing a limit order specifying all the parameters | +//+------------------------------------------------------------------+ +void BuyLimit_Sample2() + { +//--- 2. example of placing a Buy Limit pending order with all parameters + double volume=0.1; + string symbol="GBPUSD"; // specify the symbol, at which the order is placed + int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places + double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point + double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price + double price=1000*point; // unnormalized open price + price=NormalizeDouble(price,digits); // normalizing open price + int SL_pips=300; // Stop Loss in points + int TP_pips=500; // Take Profit in points + double SL=price-SL_pips*point; // unnormalized SL value + SL=NormalizeDouble(SL,digits); // normalizing Stop Loss + double TP=price+TP_pips*point; // unnormalized TP value + TP=NormalizeDouble(TP,digits); // normalizing Take Profit + datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1); + string comment=StringFormat("Buy Limit %s %G lots at %s, SL=%s TP=%s", + symbol,volume, + DoubleToString(price,digits), + DoubleToString(SL,digits), + DoubleToString(TP,digits)); +//--- everything is ready, sending a Buy Limit pending order to the server + if(!trade.BuyLimit(volume,price,symbol,SL,TP,ORDER_TIME_GTC,expiration,comment)) + { + //--- failure message + Print("BuyLimit() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("BuyLimit() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//--- Examples for placing a stop order +//+------------------------------------------------------------------+ +//| Placing a stop order at the current symbol | +//+------------------------------------------------------------------+ +void BuyStop_Sample1() + { +//--- 1. example of placing a Buy Stop pending order + string symbol="USDJPY"; // specify the symbol, at which the order is placed + int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places + double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point + double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price + double price=1000*point; // unnormalized open price + price=NormalizeDouble(price,digits); // normalizing open price +//--- everything is ready, sending a Buy Stop pending order to the server + if(!trade.BuyStop(0.1,price)) + { + //--- failure message + Print("BuyStop() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("BuyStop() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//+------------------------------------------------------------------+ +//| Placing a stop order specifying all the parameters | +//+------------------------------------------------------------------+ +void BuyStop_Sample2() + { +//--- 2. example of placing a Buy Stop pending order with all parameters + double volume=0.1; + string symbol="USDJPY"; // specify the symbol, at which the order is placed + int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places + double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point + double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price + double price=1000*point; // unnormalized open price + price=NormalizeDouble(price,digits); // normalizing open price + int SL_pips=300; // Stop Loss in points + int TP_pips=500; // Take Profit in points + double SL=price-SL_pips*point; // unnormalized SL value + SL=NormalizeDouble(SL,digits); // normalizing Stop Loss + double TP=price+TP_pips*point; // unnormalized TP value + TP=NormalizeDouble(TP,digits); // normalizing Take Profit + datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1); + string comment=StringFormat("Buy Stop %s %G lots at %s, SL=%s TP=%s", + symbol,volume, + DoubleToString(price,digits), + DoubleToString(SL,digits), + DoubleToString(TP,digits)); +//--- everything is ready, sending a Buy Stop pending order to the server + if(!trade.BuyStop(volume,price,symbol,SL,TP,ORDER_TIME_GTC,expiration,comment)) + { + //--- failure message + Print("BuyStop() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("BuyStop() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//--- Examples for working with positions +//+------------------------------------------------------------------+ +//| Position opening | +//+------------------------------------------------------------------+ +void Open() + { +//--- number of decimal places + int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); +//--- point value + double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT); +//--- receiving a buy price + double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK); +//--- calculate and normalize SL and TP levels + double SL=NormalizeDouble(price-1000*point,digits); + double TP=NormalizeDouble(price+1000*point,digits); +//--- filling comments + string comment="Buy "+_Symbol+" 0.1 at "+DoubleToString(price,digits); +//--- everything is ready, trying to open a buy position + if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,0.1,price,SL,TP,comment)) + { + //--- failure message + Print("PositionOpen() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("PositionOpen() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//+------------------------------------------------------------------+ +//| Closing a position specifying only a symbol | +//+------------------------------------------------------------------+ +void Close() + { +//--- closing a position at the current symbol + if(!trade.PositionClose(_Symbol)) + { + //--- failure message + Print("PositionClose() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("PositionClose() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//+------------------------------------------------------------------+ +//| Modification for Long position of StopLoss and TakeProfit levels| +//+------------------------------------------------------------------+ +void ModifyPosition() + { +//--- number of decimal places + int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); +//--- point value + double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT); +//--- receiving the current Bid price + double price=SymbolInfoDouble(_Symbol,SYMBOL_BID); +//--- calculate and normalize SL and TP levels + double SL=NormalizeDouble(price-1000*point,digits); + double TP=NormalizeDouble(price+1000*point,digits); +//--- everything is ready, trying to modify the buy position + if(!trade.PositionModify(_Symbol,SL,TP)) + { + //--- failure message + Print("Ìåòîä PositionModify() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("PositionModify() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//--- Examples for working with orders +//+------------------------------------------------------------------+ +//| Deleting an order by its ticket | +//+------------------------------------------------------------------+ +void DeleteOrder() + { +//--- this is a sample order ticket, it should be received + ulong ticket=1234556; +//--- everything is ready, trying to modify the buy position + if(!trade.OrderDelete(ticket)) + { + //--- failure message + Print("OrderDelete() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("OrderDelete() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } +//+------------------------------------------------------------------+ +//| Modifying a pending order | +//+------------------------------------------------------------------+ +void ModifyOrder() + { +//--- this is a sample order ticket, it should be received + ulong ticket=1234556; +//--- this is a sample symbol, it should be received + string symbol="EURUSD"; +//--- number of decimal places + int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); +//--- point value + double point=SymbolInfoDouble(symbol,SYMBOL_POINT); +//--- receiving a buy price + double price=SymbolInfoDouble(symbol,SYMBOL_ASK); +//--- calculate and normalize SL and TP levels +//--- they should be calculated based on the order type + double SL=NormalizeDouble(price-1000*point,digits); + double TP=NormalizeDouble(price+1000*point,digits); + //--- setting one day as a lifetime + datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1); +//--- everything is ready, trying to modify the order + if(!trade.OrderModify(ticket,price,SL,TP,ORDER_TIME_GTC,expiration)) + { + //--- failure message + Print("OrderModify() method failed. Return code=",trade.ResultRetcode(), + ". Code description: ",trade.ResultRetcodeDescription()); + } + else + { + Print("OrderModify() method executed successfully. Return code=",trade.ResultRetcode(), + " (",trade.ResultRetcodeDescription(),")"); + } +//--- + } + +//+------------------------------------------------------------------+ diff --git a/Experts/Articles/481/demo_caccountinfo.mq5 b/Experts/Articles/481/demo_caccountinfo.mq5 new file mode 100644 index 0000000..bef12ab --- /dev/null +++ b/Experts/Articles/481/demo_caccountinfo.mq5 @@ -0,0 +1,69 @@ +//+------------------------------------------------------------------+ +//| Demo_CAccountInfo.mq5 | +//| Copyright 2012, MetaQuotes Software Corp. | +//| http://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2012, MetaQuotes Software Corp." +#property link "http://www.mql5.com" +#property version "1.00" + +#include +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- object for working with the account + CAccountInfo account; +//--- receiving the account number, the Expert Advisor is launched at + long login=account.Login(); + Print("Login=",login); +//--- clarifying account type + ENUM_ACCOUNT_TRADE_MODE account_type=account.TradeMode(); +//--- if the account is real, the Expert Advisor is stopped immediately! + if(account_type==ACCOUNT_TRADE_MODE_REAL) + { + MessageBox("Trading on a real account is forbidden, disabling","The Expert Advisor has been launched on a real account!"); + return(-1); + } +//--- displaying the account type + Print("Account type: ",EnumToString(account_type)); +//--- clarifying if we can trade on this account + if(account.TradeAllowed()) + Print("Trading on this account is allowed"); + else + Print("Trading on this account is forbidden: you may have entered using the Investor password"); +//--- clarifying if we can use an Expert Advisor on this account + if(account.TradeExpert()) + Print("Automated trading on this account is allowed"); + else + Print("Automated trading using Expert Advisors and scripts on this account is forbidden"); +//--- if the permissible number of orders has been set + int orders_limit=account.LimitOrders(); + if(orders_limit!=0)Print("Maximum permissible amount of active pending orders: ",orders_limit); +//--- displaying company and server names + Print(account.Company(),": server ",account.Server()); +//--- displaying balance and current profit on the account in the end + Print("Balance=",account.Balance()," Profit=",account.Profit()," Equity=",account.Equity()); +//--- final display + Print(__FUNCTION__," completed"); +//--- + return(0); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + + } +//+------------------------------------------------------------------+ diff --git a/Experts/Articles/481/demo_csymbolinfo.mq5 b/Experts/Articles/481/demo_csymbolinfo.mq5 new file mode 100644 index 0000000..ecf612e --- /dev/null +++ b/Experts/Articles/481/demo_csymbolinfo.mq5 @@ -0,0 +1,69 @@ +//+------------------------------------------------------------------+ +//| Demo_CSymbolInfo.mq5 | +//| Copyright 2012, MetaQuotes Software Corp. | +//| http://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2012, MetaQuotes Software Corp." +#property link "http://www.mql5.com" +#property version "1.00" + +#include +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- object for receiving symbol settings + CSymbolInfo symbol_info; +//--- set the name for the appropriate symbol + symbol_info.Name(_Symbol); +//--- receive current rates and display + symbol_info.RefreshRates(); + Print(symbol_info.Name()," (",symbol_info.Description(),")", + " Bid=",symbol_info.Bid()," Ask=",symbol_info.Ask()); +//--- receive minimum freeze levels for trade operations + Print("StopsLevel=",symbol_info.StopsLevel()," pips, FreezeLevel=", + symbol_info.FreezeLevel()," pips"); +//--- receive the number of decimal places and point size + Print("Digits=",symbol_info.Digits(), + ", Point=",DoubleToString(symbol_info.Point(),symbol_info.Digits())); +//--- spread data + Print("SpreadFloat=",symbol_info.SpreadFloat(),", Spread(current)=", + symbol_info.Spread()," pips"); +//--- request order execution type for limitations + Print("Limitations for trade operations: ",EnumToString(symbol_info.TradeMode()), + " (",symbol_info.TradeModeDescription(),")"); +//--- clarifying trades execution mode + Print("Trades execution mode: ",EnumToString(symbol_info.TradeExecution()), + " (",symbol_info.TradeExecutionDescription(),")"); +//--- clarifying contracts price calculation method + Print("Contract price calculation: ",EnumToString(symbol_info.TradeCalcMode()), + " (",symbol_info.TradeCalcModeDescription(),")"); +//--- contracts' size + Print("Standard contract size: ",symbol_info.ContractSize(), + " (",symbol_info.CurrencyBase(),")"); +//--- minimum and maximum volumes in trade operations + Print("Volume info: LotsMin=",symbol_info.LotsMin()," LotsMax=",symbol_info.LotsMax(), + " LotsStep=",symbol_info.LotsStep()); +//--- final display + Print(__FUNCTION__," completed"); +//--- + return(0); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + + } +//+------------------------------------------------------------------+ diff --git a/Experts/Articles/481/demo_ctrade.mq5 b/Experts/Articles/481/demo_ctrade.mq5 new file mode 100644 index 0000000..4f0b507 --- /dev/null +++ b/Experts/Articles/481/demo_ctrade.mq5 @@ -0,0 +1,49 @@ +//+------------------------------------------------------------------+ +//| Demo_CTrade.mq5 | +//| Copyright 2012, MetaQuotes Software Corp. | +//| http://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2012, MetaQuotes Software Corp." +#property link "http://www.mql5.com" +#property version "1.00" + +#include +//--- object for performing trade operations +CTrade trade; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- set MagicNumber for your orders identification + int MagicNumber=123456; + trade.SetExpertMagicNumber(MagicNumber); +//--- set available slippage in points when buying/selling + int deviation=10; + trade.SetDeviationInPoints(deviation); +//--- order execution mode + trade.SetTypeFilling(ORDER_FILLING_RETURN); +//--- logging mode + trade.LogLevel(1); // it would be better not to declare this method at all, the class will set the best mode on its own +//--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend() +trade.SetAsyncMode(true); +//--- + return(0); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + + } +//+------------------------------------------------------------------+ diff --git a/Experts/Downloads/Exp_GStopLoss.mq5 b/Experts/Downloads/Exp_GStopLoss.mq5 new file mode 100644 index 0000000000000000000000000000000000000000..4d9dd05344cf371a698e6024e8d0cfba8810b56a GIT binary patch literal 25266 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 R^OnU8Z^E_Q=lNfK@IO?$p?&}W literal 0 HcmV?d00001 diff --git a/Experts/Downloads/Opening_and_ilosing_on_time.mq5 b/Experts/Downloads/Opening_and_ilosing_on_time.mq5 new file mode 100644 index 0000000000000000000000000000000000000000..feb254e9c32034ba58852600ac7c7bf06e3e1917 GIT binary patch literal 14936 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 literal 0 HcmV?d00001 diff --git a/Experts/Downloads/RobotPowerM5 meta4V12.mq5 b/Experts/Downloads/RobotPowerM5 meta4V12.mq5 new file mode 100644 index 0000000000000000000000000000000000000000..73966bcfe5b6fc41a8475fd8e372e97f870696de GIT binary patch literal 24574 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 D;SwGq literal 0 HcmV?d00001 diff --git a/Experts/TradePad/classchart.mqh b/Experts/TradePad/classchart.mqh new file mode 100644 index 0000000..779f3ab --- /dev/null +++ b/Experts/TradePad/classchart.mqh @@ -0,0 +1,297 @@ +//+------------------------------------------------------------------+ +//| CChart.mqh | +//| Copyright © 2009, MetaQuotes Software Corp. | +//| http://www.metaquotes.net | +//+------------------------------------------------------------------+ +#property copyright "Copyright © 2009, MetaQuotes Software Corp." +#property link "http://www.metaquotes.net" + +#include "ClassControlButton.mqh" +#define UP "\x0431" +#define DOWN "\x0432" + +ENUM_TIMEFRAMES periods[21]; +//+------------------------------------------------------------------+ +//| class for implemeting a chart with controls | +//+------------------------------------------------------------------+ +class CChart + { +private: + int m_top; // Y coordinate of the upper-left corner + int m_left; // X coordinate of the upper-left corner + int m_width; // width + int m_height; // height + ENUM_TIMEFRAMES m_time_frame; // timeframe + int m_scaling; // current scale + string m_symbol; // Chart symbol + string m_chart_name; // Chart object name + int m_control_width; // button width + int m_control_height; // button height + CControlButton m_controls[6]; // array of chart managing controls + bool m_first_launch; // first launch attribute + int m_period_counter; +public: + void CChart(); + void CreateChart(int l,int t,int w,int h,string s,string name); + void MoveChart(int x,int y); + void SetSymbolForChart(string symbol); + void UpScaleChart(); + void DownScaleChart(); + void DeleteChart(); + bool IsChartControlEvent(string control_name); + void DoChartOperations(string name); + ENUM_TIMEFRAMES GetChartTimeframe(){return(periods[m_period_counter]);}; + }; +//+------------------------------------------------------------------+ +//| default constructor | +//+------------------------------------------------------------------+ +void CChart::CChart() + { + m_top=0; + m_left=0; + m_time_frame=ChartPeriod(0); + m_symbol=ChartSymbol(0); + m_scaling=2; + m_control_width=30; + m_control_height=42; + m_first_launch=true; + periods[0]=PERIOD_M1; + periods[1]=PERIOD_M2; + periods[2]=PERIOD_M3; + periods[3]=PERIOD_M4; + periods[4]=PERIOD_M5; + periods[5]=PERIOD_M6; + periods[6]=PERIOD_M10; + periods[7]=PERIOD_M12; + periods[8]=PERIOD_M15; + periods[9]=PERIOD_M20; + periods[10]=PERIOD_M30; + periods[11]=PERIOD_H1; + periods[12]=PERIOD_H2; + periods[13]=PERIOD_H3; + periods[14]=PERIOD_H4; + periods[15]=PERIOD_H6; + periods[16]=PERIOD_H8; + periods[17]=PERIOD_H12; + periods[18]=PERIOD_D1; + periods[19]=PERIOD_W1; + periods[20]=PERIOD_MN1; + } +//+------------------------------------------------------------------+ +//| returns true if the managing control is pressed | +//+------------------------------------------------------------------+ +bool CChart::IsChartControlEvent(string control_name) + { + bool res=false; + for(int i=0;i<6;i++) + { + if(m_controls[i].GetControlName()==control_name)return(true); + } + return(res); + } +//+------------------------------------------------------------------+ +//| delete class graphical objects | +//+------------------------------------------------------------------+ +void CChart::DeleteChart() + { + if(ObjectFind(0,m_chart_name)>=0) ObjectDelete(0,m_chart_name); + for(int i=0;i<6;i++) + { + m_controls[i].DeleteControl(); + } + } +//+------------------------------------------------------------------+ +//| create an object with specified parameters | +//+------------------------------------------------------------------+ +void CChart::CreateChart(int l,int t,int w,int h,string s,string name) + { + for(int p=0;p<21;p++) + { + int tempPer=(int)ChartPeriod(0); + if((int)periods[p]==(int)ChartPeriod(0)) + { + m_period_counter=p; + break; + } + } +//Print("m_period_counter=",m_period_counter, " periods=",periods[m_period_counter]); +//Print("PERIOD_H4=",PERIOD_H4); +//Print("ChartPeriod(0)=",ChartPeriod(0)); + m_width=w; + m_height=h; + m_chart_name=name; + Print("Trying to create Chart object named ",m_chart_name); + if(ObjectFind(0,m_chart_name)<0)ObjectCreate(0,m_chart_name,OBJ_CHART,0,0,0,0,0); + SetSymbolForChart(s); + MoveChart(l,t); + m_first_launch=false; +//Print("Get chart width=",w," set chart width=",m_width-m_control_width); +//Print("Get chart height=",h," set chart height=",m_height); + ObjectSetInteger(0,m_chart_name,OBJPROP_XSIZE,m_width-m_control_width); +//Print("Width is set"); + ObjectSetInteger(0,m_chart_name,OBJPROP_YSIZE,m_height); +//Print("Height is set"); + ObjectSetInteger(0,m_chart_name,OBJPROP_SELECTABLE,0); +//Print("OBJPROP_SELECTABL is set"); + int left_controls=l+w-m_control_width; + int top_contols=t; +//Print("Starting placing buttons with X:Y=>",left_controls,":",top_contols); + m_controls[0].CreateButton(left_controls,top_contols, + m_control_width,m_control_height,"Scale +",UP); + m_controls[0].SetTextDetails(8,"Wingdings",White); + m_controls[0].SetTextForControl(UP); + + m_controls[1].CreateButton(left_controls,top_contols+m_control_height, + m_control_width,m_control_height,"Show Price","P"); + m_controls[1].SetTextForControl("P"); + m_controls[1].SetTextDetails(10,"Arial",White); + + m_controls[2].CreateButton(left_controls,top_contols+2*m_control_height, + m_control_width,m_control_height,"Scale -",DOWN); + m_controls[2].SetTextDetails(8,"Wingdings",White); + m_controls[2].SetTextForControl(DOWN); + + m_controls[3].CreateButton(left_controls,top_contols+3*m_control_height, + m_control_width,m_control_height,"Time Frame Up",UP); + m_controls[3].SetTextDetails(8,"Wingdings",White); + m_controls[3].SetTextForControl(UP); + + m_controls[4].CreateButton(left_controls,top_contols+4*m_control_height, + m_control_width,m_control_height,"Show Time","T"); + m_controls[4].SetTextForControl("T"); + m_controls[4].SetTextDetails(10,"Arial",White); + + m_controls[5].CreateButton(left_controls,top_contols+5*m_control_height, + m_control_width,m_control_height,"Time Frame Down",DOWN); + m_controls[5].SetTextDetails(8,"Wingdings",White); + m_controls[5].SetTextForControl(DOWN); + + for(int i=0;i<6;i++) + { + if(i<3) m_controls[i].SetBGColor(CadetBlue); + else m_controls[i].SetBGColor(SeaGreen); + } + ObjectSetInteger(0,"Show Price",OBJPROP_STATE,ObjectGetInteger(0,m_chart_name,OBJPROP_PRICE_SCALE)); + ObjectSetInteger(0,"Show Time",OBJPROP_STATE,ObjectGetInteger(0,m_chart_name,OBJPROP_DATE_SCALE)); + } +//+------------------------------------------------------------------+ +//| chart buttons pressing event | +//+------------------------------------------------------------------+ +void CChart::DoChartOperations(string name) + { +//Print("Test DoChartOperations(), name=",name); + if(name=="Show Time") + { + bool showdates=ObjectGetInteger(0,name,OBJPROP_STATE); + ObjectSetInteger(0,m_chart_name,OBJPROP_DATE_SCALE,showdates); + } + + if(name=="Show Price") + { + bool showdates=ObjectGetInteger(0,name,OBJPROP_STATE); + ObjectSetInteger(0,m_chart_name,OBJPROP_PRICE_SCALE,showdates); + } + + if(name=="Scale +") + { + UpScaleChart(); + Sleep(100); + ObjectSetInteger(0,name,OBJPROP_STATE,false); + } + + if(name=="Scale -") + { + DownScaleChart(); + Sleep(100); + ObjectSetInteger(0,name,OBJPROP_STATE,false); + } + + if(name=="Time Frame Up") + { + if(m_period_counter<20) + { + m_period_counter++; + ObjectSetInteger(0,m_chart_name,OBJPROP_PERIOD,periods[m_period_counter]); + } + Sleep(100); + ObjectSetInteger(0,name,OBJPROP_STATE,false); + } + + if(name=="Time Frame Down") + { + if(m_period_counter>0) + { + m_period_counter--; + ObjectSetInteger(0,m_chart_name,OBJPROP_PERIOD,periods[m_period_counter]); + } + Sleep(100); + ObjectSetInteger(0,name,OBJPROP_STATE,false); + } + + } +//+------------------------------------------------------------------+ +//| set the symbol | +//+------------------------------------------------------------------+ +void CChart::SetSymbolForChart(string symbol) + { + m_symbol=symbol; + ObjectSetString(0,m_chart_name,OBJPROP_SYMBOL,symbol); + } +//+------------------------------------------------------------------+ +//| move to the specified coordinates | +//+------------------------------------------------------------------+ +void CChart::MoveChart(int x,int y) + { + m_left+=x; + m_top+=y; + ObjectSetInteger(0,m_chart_name,OBJPROP_XDISTANCE,m_left); + ObjectSetInteger(0,m_chart_name,OBJPROP_YDISTANCE,m_top); + if(m_first_launch) return; + for(int i=0;i<6;i++) + { + m_controls[i].MoveControlButton(x,y); + } + } +//+------------------------------------------------------------------+ +//| zoom in the chart | +//+------------------------------------------------------------------+ +void CChart::UpScaleChart() + { +//Print(__FUNCTION__,"m_scaling =",m_scaling); + if(m_scaling<5) + { + m_scaling++; + Print(__FUNCTION__,"Set the chart scale =",m_scaling); + bool changed=ObjectSetInteger(0,m_chart_name,OBJPROP_CHART_SCALE,m_scaling); + if(!changed) + { + Print(__FUNCTION__,"Failed to zoom in the chart. Error="+string(GetLastError())); + } + else + { + Print("Chart scale =",ObjectGetInteger(0,m_chart_name,OBJPROP_CHART_SCALE)); + } + } + } +//+------------------------------------------------------------------+ +//| zoom out the chart | +//+------------------------------------------------------------------+ +void CChart::DownScaleChart() + { +//Print(__FUNCTION__,"m_scaling =",m_scaling); + if(m_scaling>0) + { + m_scaling--; + Print(__FUNCTION__,"Set the chart scale =",m_scaling); + bool changed=ObjectSetInteger(0,m_chart_name,OBJPROP_CHART_SCALE,m_scaling); + if(!changed) + { + Print(__FUNCTION__,"Failed to zoom out the chart. Error="+string(GetLastError())); + } + else + { + Print("Chart scale =",ObjectGetInteger(0,m_chart_name,OBJPROP_CHART_SCALE)); + } + } + } +//+------------------------------------------------------------------+ diff --git a/Experts/TradePad/classcontrolbutton.mqh b/Experts/TradePad/classcontrolbutton.mqh new file mode 100644 index 0000000..373f8cf --- /dev/null +++ b/Experts/TradePad/classcontrolbutton.mqh @@ -0,0 +1,118 @@ +//+------------------------------------------------------------------+ +//| CControlButton.mqh | +//| Copyright © 2009, MetaQuotes Software Corp. | +//| http://www.metaquotes.net | +//+------------------------------------------------------------------+ +#property copyright "Copyright © 2009, MetaQuotes Software Corp." +#property link "http://www.metaquotes.net" +//+------------------------------------------------------------------+ +//| control object | +//+------------------------------------------------------------------+ +class CControlButton + { +private: + string m_control_name; // control's unique name + int m_top; // Y coordinate of the upper-left corner + int m_left; // X coordinate of the upper-left corner + int m_width; // control width + int m_heigt; // control height + string m_text; // control text + string m_font; // text font + int m_text_size; // control text size + color m_text_color; // text color + color m_bg_color; // background color +public: + void CControlButton(){m_top=0; m_left=0;m_text_size=10;m_font="Arial";m_bg_color=Blue;}; + void CreateButton(int l,int t,int w,int h,string button_name,string button_text); + void MoveControlButton(int shiftX,int shiftY); + void SetTextDetails(int text_size,string font_name,color text_color); + void SetTextForControl(string text); + void SetWidthAndHeight(int w,int h); + void SetBGColor(color bg_color); + void DeleteControl(); + string GetControlName(){return(m_control_name);}; + }; +//+------------------------------------------------------------------+ +//| create the control | +//+------------------------------------------------------------------+ +void CControlButton::CreateButton(int l,int t,int w,int h, + string button_name,string button_text) + { + m_top=0; + m_left=0; + m_control_name=button_name; + //Print("CreateButton function is creating control named ",button_name); + if(ObjectFind(0,m_control_name)<0) ObjectCreate(0,m_control_name,OBJ_BUTTON,0,0,0,0,0); + SetWidthAndHeight(w,h); + MoveControlButton(l,t); + ObjectSetInteger(0,m_control_name,OBJPROP_SELECTABLE,false); + + } +//+------------------------------------------------------------------+ +//| delete the control | +//+------------------------------------------------------------------+ +void CControlButton::DeleteControl() + { + if(ObjectFind(0,m_control_name)>=0) + { + if(!ObjectDelete(0,m_control_name)) + { + Print("Failed to delete the object named ",m_control_name,"! Error #",GetLastError()); + } + } + } +//+------------------------------------------------------------------+ +//| move control along the axes by the specified values | +//+------------------------------------------------------------------+ +void CControlButton::MoveControlButton(int shiftX,int shiftY) + { + m_top+=shiftY; + m_left+=shiftX; + ObjectSetInteger(0,m_control_name,OBJPROP_XDISTANCE,m_left); + ObjectSetInteger(0,m_control_name,OBJPROP_YDISTANCE,m_top); + } +//+------------------------------------------------------------------+ +//| set control's height and width | +//+------------------------------------------------------------------+ +void CControlButton::SetWidthAndHeight(int w,int h) + { + m_width=w; + m_heigt=h; + ObjectSetInteger(0,m_control_name,OBJPROP_XSIZE,m_width); + ObjectSetInteger(0,m_control_name,OBJPROP_YSIZE,m_heigt); + } +//+------------------------------------------------------------------+ +//| set control text attributes | +//+------------------------------------------------------------------+ +void CControlButton::SetTextDetails(int text_size, + string font_name,color text_color) + { + m_text_size=text_size; + m_font=font_name; + m_text_color=text_color; + //Print("Start setting attributes for the button named ",m_control_name); + ObjectSetInteger(0,m_control_name,OBJPROP_COLOR,text_color); + //Print("Button text color is set ",m_control_name); + ObjectSetString(0,m_control_name,OBJPROP_FONT,font_name); + //Print("Button text font is set ",m_control_name); + ObjectSetInteger(0,m_control_name,OBJPROP_FONTSIZE,m_text_size); + //Print("Button text font size is set ",m_control_name); + } +//+------------------------------------------------------------------+ +//| set control text | +//+------------------------------------------------------------------+ +void CControlButton::SetTextForControl(string text) + { + m_text=text; + //Print("Set control text:",text); + ObjectSetString(0,m_control_name,OBJPROP_TEXT,m_text); + } +//+------------------------------------------------------------------+ +//| set control background color | +//+------------------------------------------------------------------+ +void CControlButton::SetBGColor(color bg_color) + { + m_bg_color=bg_color; + ObjectSetInteger(0,m_control_name,OBJPROP_BGCOLOR,m_bg_color); + } +//+------------------------------------------------------------------+ diff --git a/Experts/TradePad/classsymbolbutton.mqh b/Experts/TradePad/classsymbolbutton.mqh new file mode 100644 index 0000000..b3d8302 --- /dev/null +++ b/Experts/TradePad/classsymbolbutton.mqh @@ -0,0 +1,105 @@ +//+------------------------------------------------------------------+ +//| CSymbolButton.mqh | +//| Copyright © 2009, MetaQuotes Software Corp. | +//| http://www.metaquotes.net | +//+------------------------------------------------------------------+ +#property copyright "Copyright © 2009, MetaQuotes Software Corp." +#property link "http://www.metaquotes.net" + +//+------------------------------------------------------------------+ +//| Class for creating a symbol button | +//+------------------------------------------------------------------+ +class CSymbolButton + { +private: + double m_top; // Y coordinate of the upper-left corner + double m_left; // X coordinate of the upper-left corner + double m_height; // button height + double m_width; // button width + color m_txt_col; // text color + color m_bg_col; // background color + int m_ind_handle; // pointer to the indicator for the button + string m_symbol_name; // name of the Symbol, for which the button is created + +public: + string m_button_name; // button's unique name + bool CreateSymbolButton(double top,double left,double height,double width, + string buttonID,color TextColor,color BGColor);// constructor + bool DeleteSymbolButton(); + void MoveButton(int x_shift,int y_shift); + color GetBGColor(){return(m_bg_col);}; + void SetBGColor(color bg_color); + string GetSymbolName(){return(m_symbol_name);}; + void SetSymbolName(string s){m_symbol_name=s;}; + }; +//+------------------------------------------------------------------+ +//| delete Symbol button | +//+------------------------------------------------------------------+ +bool CSymbolButton::DeleteSymbolButton() + { + if(ObjectFind(0,m_button_name)>=0) + { + //Print("Delete the cell with the name ",m_button_name); + if(!ObjectDelete(0,m_button_name)) + { + Print("Failed to delete the object named ",m_button_name,"! Error #",GetLastError()); + } + else + { + //ChartRedraw(0); + } + return(true); + } + return(false); + } +//+------------------------------------------------------------------+ +//| setup object of Class CSymbolButton | +//+------------------------------------------------------------------+ +bool CSymbolButton::CreateSymbolButton(double top,double left,double height,double width, + string buttonID,color TextColor,color BGColor) + { + bool res=false; +//--- + if(ObjectFind(0,buttonID)<0) + { + m_top=top; + m_left=left; + ObjectCreate(ChartID(),buttonID,OBJ_BUTTON,0,0,0,0,0); + ObjectSetInteger(0,buttonID,OBJPROP_COLOR,TextColor); + ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,BGColor); + ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,int(m_left)); + ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,int(m_top)); + ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,int(width)); + ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,int(height)); + ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial"); + ObjectSetString(0,buttonID,OBJPROP_TEXT,buttonID); + ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10); + ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0); + m_button_name=buttonID; + SetSymbolName(buttonID); + //ChartRedraw(ChartID()); + } +// else +// { +// } +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| set Symbol button background color | +//+------------------------------------------------------------------+ +void CSymbolButton::SetBGColor(color bg_color) + { + ObjectSetInteger(0,m_button_name,OBJPROP_BGCOLOR,bg_color); + } +//+------------------------------------------------------------------+ +//| shift the symbol button by the specified value | +//+------------------------------------------------------------------+ +void CSymbolButton::MoveButton(int x_shift,int y_shift) + { + m_top+=y_shift; + m_left+=x_shift; + ObjectSetInteger(0,m_button_name,OBJPROP_XDISTANCE,int(m_left)); + ObjectSetInteger(0,m_button_name,OBJPROP_YDISTANCE,int(m_top)); +//ChartRedraw(0); + } diff --git a/Experts/TradePad/classtradepad.mqh b/Experts/TradePad/classtradepad.mqh new file mode 100644 index 0000000..a73c37e --- /dev/null +++ b/Experts/TradePad/classtradepad.mqh @@ -0,0 +1,414 @@ +//+------------------------------------------------------------------+ +//| CChart.mqh | +//| Copyright © 2009, MetaQuotes Software Corp. | +//| http://www.metaquotes.net | +//+------------------------------------------------------------------+ +#property copyright "Copyright © 2009, MetaQuotes Software Corp." +#property link "http://www.metaquotes.net" + +#include "ClassSymbolButton.mqh" +#include "ClassChart.mqh" +//+------------------------------------------------------------------+ +//| class for implementation of Symbols table | +//+------------------------------------------------------------------+ +class CTradePad + { +private: + int m_rows; // number of strings in the Symbols table + int m_columns; // number of columns in the Symbols table + int m_button_width; // width of the cell containing a symbol + int m_button_height; // height of the cell containing a symbol + int m_top; // X coordinate of the upper left corner + int m_left; // Y coordinate of the upper left corner + int m_left_previous_header; // previous X value for the upper left corner of the header + int m_top_previos_header; // previous Y value for the upper left corner of the header + color m_button_text_color; // unified text color for the buttons + color m_button_bg_color; // unified background color for the buttons + string m_prefix; // unified prefix for the created CSymbolButton type objects + string m_chart_name; // Chart Object name + int m_top_chart; // Y coordinate of the table's upper left corner + int m_left_chart; // X coordinate of the table's upper left corner + int m_footer_width; // footer width + CSymbolButton m_symbol_set[]; // array with the objects for managing Symbol buttons + string m_header; // name of the line for dragging the object + int m_top_buy_button; // Y coordinate of the upper left corner of BUY button + int m_left_buy_button; // X coordinate of the upper left corner of BUY + int m_top_sell_button; // Y coordinate of the upper left corner of SELL button + int m_left_sell_button; // X coordinate of the upper left corner of SELL button + int m_top_lots_edit; // Y coordinate of the upper left corner of the field for specifying the volume + int m_left_lots_edit; // X coordinate of the upper left corner of the field for specifying the volume + int m_width_lots_edit; // volume field width + string m_buy_button; // BUY button name + string m_sell_button; // SELL button name + string m_lots_edit; // volume field name + string m_chart_symbol_name; // name of the Symbol displaying Chart object + ENUM_TIMEFRAMES m_current_tf; // period of the Symbol displaying Chart object + color m_up_color; + color m_down_color; + color m_flat_color; + color m_blank_color; + CChart tradeChart; // chart object +public: + void CTradePad(); // constructor + bool CreateTradePad(int cols,int rows,int Xleft,int Ytop,int width,int height,color u,color d,color f,color b); + int DeleteTradePad(); + string GetChartName(){return(m_chart_name);}; + int GetSymbolButtons(){return(ArraySize(m_symbol_set));}; + void SetButtons(string symbolName); + void MoveTradePad(int x_shift,int y_shift); + void GetShiftTradePad(int &x_shift,int &y_shift); + string GetHeaderName(){return(m_header);}; + void SetButtonColors(); + void SetTrendColors(color u,color d,color f,color b){m_up_color=u;m_down_color=d;m_flat_color=f; m_blank_color=b;}; + void EmptyFunction(); + }; +//+------------------------------------------------------------------+ +//| default constructor (always without parameters) | +//+------------------------------------------------------------------+ +void CTradePad::CTradePad() + { + m_button_bg_color=Green; + m_button_text_color=White; + m_prefix="cell_"; + m_header="TablePad"; + m_chart_name="test"; + m_buy_button="BuyButton"; + m_sell_button="SellButton"; + m_lots_edit="InputVolume"; + } +//+------------------------------------------------------------------+ +//| creating Symbols Table (actually, it is a constructor) | +//+------------------------------------------------------------------+ +bool CTradePad::CreateTradePad(int cols,int rows,int Xleft,int Ytop,int width,int height, + color u,color d,color f,color b) + { + bool res=false; +//--- + SetTrendColors(u,d,f,b); + m_left=Xleft; + m_top=Ytop; + int Yord,Xord; +//--- how many buttons will we have? + ArrayResize(m_symbol_set,cols*rows); + int j=0,tradeSymbols=SymbolsTotal(false); + string symb[]; + ArrayResize(symb,cols*rows); + +//--- draw the header + m_top_previos_header=m_top-20; + m_left_previous_header=m_left; + if(ObjectFind(0,m_header)<0) ObjectCreate(0,m_header,OBJ_BUTTON,0,0,0,0,0); + ObjectSetInteger(0,m_header,OBJPROP_COLOR,White); + ObjectSetInteger(0,m_header,OBJPROP_BGCOLOR,Blue); + ObjectSetInteger(0,m_header,OBJPROP_XDISTANCE,m_left_previous_header); + ObjectSetInteger(0,m_header,OBJPROP_YDISTANCE,m_top_previos_header); + ObjectSetInteger(0,m_header,OBJPROP_XSIZE,cols*width); + ObjectSetInteger(0,m_header,OBJPROP_YSIZE,20); + ObjectSetString(0,m_header,OBJPROP_TEXT,"Trade Pad "); + ObjectSetString(0,m_header,OBJPROP_FONT,"Tahoma"); + ObjectSetInteger(0,m_header,OBJPROP_SELECTABLE,true); + +//--- draw the buttons + for(int c=0;c=tradeSymbols) j=0; + name=SymbolName(j,false); + j++; + symb[c*rows+r]=name; + SymbolSelect(name,true); + double v; + color col; + col=GetColorOfSymbol(name,PERIOD_CURRENT, + m_up_color,m_down_color, + m_flat_color,m_blank_color,v); + m_symbol_set[c*rows+r].CreateSymbolButton(Yord, + Xord, + height, + width, + name, + m_button_text_color, + col); + //Sleep(10);// pause in order to see the buttons' generation + } + } +//--- click the first button + ObjectSetInteger(0,symb[0],OBJPROP_STATE,true); + +//--- create Chart object + double chartheight=252; + m_current_tf=ChartPeriod(0); +// if(ObjectFind(0,m_chart_name)<0)ObjectCreate(0,m_chart_name,OBJ_CHART,0,0,0,0,0); + + m_top_chart=m_top+rows*height; + m_left_chart=m_left; +/* + ObjectSetInteger(0,m_chart_name,OBJPROP_XDISTANCE,m_left_chart); + ObjectSetInteger(0,m_chart_name,OBJPROP_YDISTANCE,m_top_chart); +*/ + m_footer_width=cols*width; +/* + ObjectSetInteger(0,m_chart_name,OBJPROP_XSIZE,m_footer_width); + chartheight=cols*width/4.0*3.0; + ObjectSetInteger(0,m_chart_name,OBJPROP_YSIZE,(int)chartheight); + ObjectSetInteger(0,m_chart_name,OBJPROP_SELECTABLE,0); + ObjectSetString(0,m_chart_name,OBJPROP_SYMBOL,symb[0]); + +*/ + chartheight=252; + tradeChart.CreateChart(m_left_chart,m_top_chart,m_footer_width,int(chartheight),symb[0],"testChart"); + +//--- create the footer +//--- SELL button + if(ObjectFind(0,m_sell_button)<0) ObjectCreate(0,m_sell_button,OBJ_BUTTON,0,0,0,0,0); + ObjectSetInteger(0,m_sell_button,OBJPROP_COLOR,White); + ObjectSetInteger(0,m_sell_button,OBJPROP_BGCOLOR,OrangeRed); + m_top_sell_button=int(m_top_chart+chartheight); + m_left_sell_button=m_left_chart; + ObjectSetInteger(0,m_sell_button,OBJPROP_XDISTANCE,m_left_sell_button); + ObjectSetInteger(0,m_sell_button,OBJPROP_YDISTANCE,m_top_sell_button); + ObjectSetInteger(0,m_sell_button,OBJPROP_XSIZE,100); + ObjectSetInteger(0,m_sell_button,OBJPROP_YSIZE,40); + ObjectSetString(0,m_sell_button,OBJPROP_FONT,"Tahoma"); + ObjectSetInteger(0,m_sell_button,OBJPROP_FONTSIZE,15); + ObjectSetString(0,m_sell_button,OBJPROP_TEXT,"SELL"); + ObjectSetInteger(0,m_sell_button,OBJPROP_SELECTABLE,false); + +//--- BUY button + if(ObjectFind(0,m_buy_button)<0) ObjectCreate(0,m_buy_button,OBJ_BUTTON,0,0,0,0,0); + ObjectSetInteger(0,m_buy_button,OBJPROP_COLOR,White); + ObjectSetInteger(0,m_buy_button,OBJPROP_BGCOLOR,Blue); + m_top_buy_button=m_top_sell_button; + m_left_buy_button=m_left_chart+m_footer_width-100; + ObjectSetInteger(0,m_buy_button,OBJPROP_XDISTANCE,m_left_buy_button); + ObjectSetInteger(0,m_buy_button,OBJPROP_YDISTANCE,m_top_buy_button); + ObjectSetInteger(0,m_buy_button,OBJPROP_XSIZE,100); + ObjectSetInteger(0,m_buy_button,OBJPROP_YSIZE,40); + ObjectSetString(0,m_buy_button,OBJPROP_FONT,"Tahoma"); + ObjectSetInteger(0,m_buy_button,OBJPROP_FONTSIZE,15); + ObjectSetString(0,m_buy_button,OBJPROP_TEXT,"BUY"); + ObjectSetInteger(0,m_buy_button,OBJPROP_SELECTABLE,false); + +//--- Volume field + if(ObjectFind(0,m_lots_edit)<0) ObjectCreate(0,m_lots_edit,OBJ_EDIT,0,0,0,0,0); + ObjectSetInteger(0,m_lots_edit,OBJPROP_COLOR,White); + ObjectSetInteger(0,m_lots_edit,OBJPROP_BGCOLOR,DarkOliveGreen); + m_top_lots_edit=m_top_sell_button; + m_left_lots_edit=m_left_chart+100; + m_width_lots_edit=m_footer_width-200; + ObjectSetInteger(0,m_lots_edit,OBJPROP_XDISTANCE,m_left_lots_edit); + ObjectSetInteger(0,m_lots_edit,OBJPROP_YDISTANCE,m_top_lots_edit); + ObjectSetInteger(0,m_lots_edit,OBJPROP_XSIZE,m_width_lots_edit); + ObjectSetInteger(0,m_lots_edit,OBJPROP_YSIZE,40); + ObjectSetString(0,m_lots_edit,OBJPROP_FONT,"Tahoma"); + ObjectSetInteger(0,m_lots_edit,OBJPROP_FONTSIZE,10); + ObjectSetString(0,m_lots_edit,OBJPROP_TEXT," 0.1"); + ObjectSetInteger(0,m_lots_edit,OBJPROP_SELECTABLE,false); + +//--- command for drawing all the changes + ChartRedraw(0); + +//--- wait a bit and try to draw the buttons' background once again + Sleep(300); + SetButtonColors(); + ChartRedraw(0); + +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| set background color | +//+------------------------------------------------------------------+ +void CTradePad::SetButtonColors() + { + int i,buttons=GetSymbolButtons(); + double v;// indicator values are received here + + struct IndicatorValue + { + string symbol; + ENUM_TIMEFRAMES timeframe; + double value; + }; + + IndicatorValue state[]; + ArrayResize(state,buttons); +//Print("SetButtonColors"); +//--- + string out=""; + for(i=0;i=0) + { + int size=GetSymbolButtons(); + for(int i=0;i=0)ObjectDelete(0,SymbolTable.GetChartName()); + ChartRedraw(0); +//Print(del," Symbols deleted"); +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| initialization during the launch or re-initialization | +//+------------------------------------------------------------------+ +void OnInit() + { + EventSetTimer(TimerPeriodSeconds); + Print("Init"); + if(!launched) + { + CreatePad(TableCols,TableRows); + launched=true; + } + } +//+-----------------------------------------------------------------------------------+ +//| when the Expert Advisor's operation is complete or input parameters are changed | +//+-----------------------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- + Print("Deinit"); + launched=false; +//--- disable the timer + EventKillTimer(); +//--- delete the object + DeletePad(); + } +//+------------------------------------------------------------------+ +//| Process chart events | +//+------------------------------------------------------------------+ + +void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) + { + //Print("OnChartEvent event: lparam =",lparam," dparam=",dparam); + + if(id==CHARTEVENT_OBJECT_CLICK) + { + string clickedButton=sparam; + SymbolTable.SetButtons(clickedButton); + ChartRedraw(); + } + if(id==CHARTEVENT_OBJECT_DRAG) + { + string dragged=sparam; + //Print("Shifted the object ",dragged," lparam =",lparam," dparam=",dparam); + if(dragged==SymbolTable.GetHeaderName()) + { + int x=ObjectGetInteger(0,dragged,OBJPROP_XDISTANCE); + int y=ObjectGetInteger(0,dragged,OBJPROP_YDISTANCE); + SymbolTable.GetShiftTradePad(x,y); + //Print("X shift = ",x," Y shift = ",y); + SymbolTable.MoveTradePad(x,y); + ChartRedraw(); + } + } + + } +//+------------------------------------------------------------------+ +//| processing timer events | +//+------------------------------------------------------------------+ +void OnTimer() + { + //Print("Timer event"); + if(launched)SymbolTable.SetButtonColors(); + } + +//+------------------------------------------------------------------+ diff --git a/Indicators/Downloads/Macd FRAMA.mq5 b/Indicators/Downloads/Macd FRAMA.mq5 new file mode 100644 index 0000000000000000000000000000000000000000..42b0658539eb25b58b4d5c03ecec256436a4f1fa GIT binary patch literal 15720 zcmeHOdrw;G zxVFE4kNb{0b!T{*_|HA}FZ^D(b9dm5Fuv>RxNo`#uHn9O_uMde=YZ37Z&D}%i+}G$ zuuj}N_Y?440D1>F?t3~erh-eFufbE_eGh3byIcRc57>VK@;3w6%bts6cY~4SzmKt& zzh%I&!trRz(mRS2G}U6UxB?1sVDB4 z+jZ->Ur*u8zdcd=M*|67g1eTNcMm*Wd8r=b$t^~3+$FAtSyBV_`zw3{)_mdPtrRDL*kx#{l9|5 zp1Cde9G@-s!u>oE-SlwseU(DpaDRgz(~Il)UBMN9o9+>w*PXom29lMh^0wi=#oI|_ z9i-JPmDXFx>>OG>o>Ec*-AZc1Z9`7mkX$R3*XBf&2YCtXHt4&8CTPEJAbVQzdq_v0 zU&4-0y+uArInj3;7~4UN=|lS6iD;mI9Kll0pcmR&bE4Tn_A5Er_W}77)KKcfV^f)J z3QQ|;vC3(sEbv5{yO872M7#z`37m$XO-p60l+2re=dO?L%x)TqE`aOW>#gtS*fG4; zOcAl2uc_-KH^o@-|eE);@!1<|eY6E&cg3k@` zOb@?AEEj#m6^=aXU_{5q)sFiIezkt2oNizZZSy3n!%_Di2lULxYC`0rQF0sHZQ)A^ zR9w~5N{&7ZsJ3x9E4!@yv5M;9BOXMn6Y1>1F0VZvTIf6X1X9&nu!2fE*xwDVStmX9 zKD6#$rq#ex_}NQ*tEs(>1DEwruUtY5f}Q(cB^A1sD88C#p++k+i3 zyD~yo3N1x&?gIY{*vqeorFB$Gq23ScvIG$BVU1t$5kjF>J@nonyW9L$!+1g)Hb=AW zWOIsh>1bRbV`cGGL1US8ue?9rK$2Z}sK{|E)!1){nap0yX8bA~dfYz;QDL598SQ7h zSkLIQM)-fQ0_vVM z`fT&OWF-EbPb*OE(grqs3~nO}vsR=uhFOBV?IVJ-hPw9ixJJ%f4f~VF$crt!WrVlT zj}SHOoTC&g>nyJ261M=@axFDy$OJ*I*{c|$t!@`UAFKCnTC?62+8JnLhjliz$+~Vf zuvqP1`fNHKJkFNYj%c8bK1mB&WZ&t=>*nro?+#6EcLAJ=ow2h`%8KF>BiRWo`U$Lz zz2XWu+C$&x0zE+TRmZ)}m{qr$Mgw+rt)*AfXm|}-FjrPm?8B^Fb7inMrM!cVLIrd& z!d87X!gVUEl6NDaF8MxR!)IcyNZ1do_!VMjDCP911yKK$=bgUGiiX~Pn$E1DiV4ya z-;%1|`dPecY4$j4&>fU;9p^*;0+GEb@ zKvtNRDqWp+U;+A^tNaf1+=re?$ukd+D-!CTRwGmr7duMYy|I>1Mn@g%l&Ytcv-g0d zsM|0a0_%_QsVu4}%W=?7l*j3)6iW*>EE2XWhkfus$&1Xbq^)KG6~z^9IUh}L?^!Bz zJ;%OZDiEn)tc#}pF zX2N~<5P!ugzD9OD_PviTeiNV5LIkAz9{819eq7(j&miH@lP|-+0cwcv1hYre!W>(-uQ6lD|OA(;dsl!eL&{Q^uId6Ao5iuTe3tMNdZ8$g{y4W3}9g zWyH38;3Fd|AFd&|me|Bfq6ZzYM!1h$(7<;QZ@JdlLaeh~#x_?3|8M}m=}*Hf0!zcg z6Ks?&S60*EnpR?r^jde4!n~BGhrBX?yp-}vj%SI1wVUoN^Mp|XT_qW>9^YzJ7I%X| zuCqMaN|JuVDA|Ws6#391G-Bt+@|SveAG2%T)3`RH4CF)W4bggBC_FEwYdMu?cw(VQ zG-EZ*2(0m1aDT|$XZ27_`Pv<{MeQ%IIltMGF1R@viIIgkGv zYj09pTpUTSRF|(|4Y4-HrEq%sXy?WBF`}qEl|Jsi#}rzhu&b+VR*v!o$xr;kja&Dd~?Q*{XL{?!5XkP{Awu;prcLlOo!uu*R zJ?&aX7xlM=yTAq4UB`4Fm1lE z7;P4l=dt#?=!~$#NvfB;K3P-5k*S)|LSA>Az2;|6XGwX8#nw>d4PR`+b}A(DiDyo4 z6OA!!qDU8cJ&v-Btl!bEiy%wZDfhiRc56jNP}x`b5@`;QMJ1k=%lEEU)ts4C#W9Sh z#(1Wn3;6k665SiF;C%z@kS?+#^9EPrvSZ2^sQWJ#R%MW9pCj+`^qGaQRPc5MkQqPK zs&$^M(Te;r=7hPv=k4F-c*ze6Q!|v_hc3`V^lcvb6=&c=dPCgD$58+4 ziEs11Q=9>ZTZmLWfrCX;0rB))1D+k;R?XThoAC%~SY5|=Sz2w5D_*I^7|NkrS>#u4 zayEAO`YpdhKHj-;yROfkoUtA41y~|0B0cBQ#=Z18lgw&j0o`k!^(YH mm^eNiufV-%?WLE4=$$GdoRh+gw_cK5&JqpkD+ literal 0 HcmV?d00001 diff --git a/Profiles/Charts/Default/chart01.chr b/Profiles/Charts/Default/chart01.chr deleted file mode 100644 index 5ad851c9c1bd49b35a1dc76b2c424863940603ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39022 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 P&-oq~?0WpZoUh%VqUCf{ diff --git a/Profiles/Charts/Default/chart03.chr b/Profiles/Charts/Default/chart03.chr deleted file mode 100644 index 2171f3ba9cc4c26085b8e6d50e30216a732fc3a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25378 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 b|DWP_{C_@xf0-QetSt51MXOr>ei{A;h}4IH