#ifndef _C_CONVERT_
#define _C_CONVERT_

class CConvert
  {
private:
   string            cSymbol;
   string            cAccCurrency;
   string            cCurrency[2];
   int               cPow[2];
   double            cTickSize;
   double            cPoint;
public:
                     CConvert(string mSymbol=NULL);
   double            GetPointPrice(int mCount=1);
   double            GetLotPercentBallanceRisk(double mRisk,double mDeltaPrice) {return MathAbs(AccountInfoDouble(ACCOUNT_BALANCE)*mRisk/GetPointPrice((int)MathRound(mDeltaPrice/cPoint)));}
private:
   void              ComputeParam();
   bool              OneStepCross(string mProfit,string mBase);
   bool              FindCross(string mCross,string mProfit);
  };
//-----------------------------------------------------------
CConvert::CConvert(string mSymbol=NULL):cSymbol(mSymbol==NULL?_Symbol:mSymbol),cAccCurrency(AccountInfoString(ACCOUNT_CURRENCY)),
                                        cTickSize(SymbolInfoDouble(mSymbol,SYMBOL_TRADE_TICK_SIZE)),
                                        cPoint(SymbolInfoDouble(mSymbol,SYMBOL_POINT)){
   ComputeParam();}
//-------------------------------------------------------------
double CConvert::GetPointPrice(int mCount=1){
   double tickValue=SymbolInfoDouble(cSymbol,SYMBOL_TRADE_TICK_VALUE);
   if (!cTickSize) cTickSize=SymbolInfoDouble(cSymbol,SYMBOL_TRADE_TICK_SIZE);
   if (!cPoint) cPoint=SymbolInfoDouble(cSymbol,SYMBOL_POINT);
   if (tickValue!=0.0&&cTickSize!=0.0&&cPoint!=0.0) return mCount*tickValue*cPoint/cTickSize;
   if (!cPow[0]) return 1.0*mCount;
   double res=MathPow(SymbolInfoDouble(cCurrency[0],SYMBOL_BID),cPow[0]);
   if (!cPow[1]) return res*mCount;
   else return mCount*res*MathPow(SymbolInfoDouble(cCurrency[1],SYMBOL_BID),cPow[1]);}
//--------------------------------------------------------------
CConvert::ComputeParam(void){
   cCurrency[0]=cCurrency[1]=NULL;
   ArrayInitialize(cPow,0);
   string profit=SymbolInfoString(cSymbol,SYMBOL_CURRENCY_PROFIT),
          base=SymbolInfoString(cSymbol,SYMBOL_CURRENCY_BASE);
   if (cAccCurrency==profit   ||
       (!OneStepCross(profit,base)
        &&!FindCross("USD",profit)
        &&!FindCross("EUR",profit))) return;}
//---------------------------------------------------------------
bool CConvert::OneStepCross(string mProfit,string mBase){
   string name=mProfit+cAccCurrency;
   if (SymbolSelect(name,true)){
      cCurrency[0]=name;
      cPow[0]=1;
      return true;}
   else if (SymbolSelect(name=cAccCurrency+mProfit,true)){
      cCurrency[0]=name;
      cPow[0]=-1;
      return true;}
   else if (SymbolSelect(name=mBase+cAccCurrency,true)){
      cCurrency[0]=cSymbol;   cCurrency[1]=name;
      cPow[0]=-1;             cPow[1]=1;
      return true;}
   else if (SymbolSelect(name=cAccCurrency+mBase,true)){
      cCurrency[0]=cSymbol;   cCurrency[1]=name;
      cPow[0]=-1;             cPow[1]=-1;
      return true;}
   else return false;}
//--------------------------------------------------------------------
bool CConvert::FindCross(string mCross,string mProfit){
   string name=mCross+cAccCurrency,
          temp=name;
   if (!SymbolSelect(name,true)&&!SymbolSelect(name=cAccCurrency+mCross,true)) return false;
   cCurrency[1]=name;
   cPow[1]=name==temp?1:-1;
   temp=mProfit+mCross;
   if (!SymbolSelect(name=temp,true)&&!SymbolSelect(name=mCross+mProfit,true)) return false;
   cCurrency[0]=name;
   cPow[0]=name==temp?1:-1;
   return true;}
   
#endif