//+------------------------------------------------------------------+
//|                                                  PrintParams.mq4 |
//|                                                                I |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "ME INC."
#property link      ""

#include <stdlib.mqh>
#include <stderror.mqh>
#include <WinUser32.mqh> 

// #property show_inputs
extern bool flagAtrTp = false;
extern bool flagAtrSl = false;
extern bool hiddenStops = true;
extern bool entry50 = true;
extern int hiddenSl = 170;
extern int hiddenTp = 50;
extern int tf = PERIOD_M15;
extern int atrPeriod = 480;
extern double atrSl = 1.0;
extern double atrTp = 0.7;
extern double riskPerTrade = 2.0;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
    double atr, px, px00Level, tmp00Level, stopLoss, stopLossLevel, takeProfit, takeProfitLevel, riskPercent, numLots;
    int pxTokenInt, pxTokenInt5, ticket, err;
    string pxString, pxToken, pxToken5, tmp00LevelString, px00LevelString;
    
    px = MarketInfo(Symbol(), MODE_BID);
    
    if (flagAtrTp || flagAtrSl)
    {        
        atr = iATR(NULL, tf, atrPeriod, 0);
    }
    
    if (flagAtrTp)
    {        
        takeProfit = (atrTp * atr) + (MarketInfo(Symbol(), MODE_SPREAD) * Point);
    }
    else
    {
        takeProfit = (hiddenTp * Point) + (MarketInfo(Symbol(), MODE_SPREAD) * Point); 
    }
    
    if (flagAtrSl)
    {
        stopLoss = (atrSl * atr) + (MarketInfo(Symbol(), MODE_SPREAD) * Point);            
    }
    else
    {
        stopLoss = (hiddenSl * Point) + (MarketInfo(Symbol(), MODE_SPREAD) * Point);  
    }
    
    riskPercent = riskPerTrade / 100;        
    numLots = getLotSize(Symbol(), riskPercent, stopLoss); 
    
    // px = 1.23943;
    // px = 140.943;
    
    pxString = DoubleToStr(px, Digits - 1);   
    
    if (StringLen(pxString) == 6)
    {
        pxToken = StringSubstr(pxString, 4, 1);
        pxToken5 = StringSubstr(pxString, 5, 1);
        tmp00LevelString = StringSubstr(pxString, 0, 4);
    }
    else if (StringLen(pxString) == 5)
    {
        pxToken = StringSubstr(pxString, 3, 1);
        pxToken5 = StringSubstr(pxString, 4, 1);
        tmp00LevelString = StringSubstr(pxString, 0, 3);
    }
    
    pxTokenInt = StrToInteger(pxToken);
    pxTokenInt5 = StrToInteger(pxToken5);
    
    Print("px = ", px);
    Print("pxString = ", pxString);
    Print("pxToken = ", pxToken);
    Print("pxToken5 = ", pxToken5);
    
    if (entry50)
    {
        switch(pxTokenInt)
        {
            case 0:             
                Print("CASE 0");
                if (pxTokenInt5 <= 5)
                {
                    if (Digits == 5)
                    {
                        tmp00Level = StrToDouble(StringSubstr(pxString, 0, 5)) - 0.001;
                        tmp00LevelString = DoubleToStr(tmp00Level, 2);                        
                        px00LevelString = StringConcatenate(tmp00LevelString, "000");
                       // Print("tmp00Level = ", tmp00Level, " - tmp00LevelString = ", tmp00LevelString, " - px00LevelString = ", px00LevelString);
                    }
                    
                    if (Digits == 3)
                    {
                        tmp00Level = StrToDouble(StringSubstr(pxString, 0, 5)) - 0.1;
                        tmp00LevelString = DoubleToStr(tmp00Level, 0);
                        px00LevelString = StringConcatenate(tmp00LevelString, "000");
                        // Print("tmp00Level = ", tmp00Level, " - tmp00LevelString = ", tmp00LevelString, " - px00LevelString = ", px00LevelString);
                    }
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "050");
                }                        
                break;
            case 1: 
                Print("CASE 1");                
                if (pxTokenInt5 >= 5)
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "150");            
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "100");
                }                                
                break;            
            case 2: 
                Print("CASE 2");
                if (pxTokenInt5 >= 5)
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "250");            
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "200");
                }
                break;            
            case 3: 
                Print("CASE 3");
                if (pxTokenInt5 >= 5)
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "350");            
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "300");
                }
                break;            
            case 4: 
                Print("CASE 4");
                if (pxTokenInt5 >= 5)
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "450");            
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "400");
                }
                break;            
            case 5: 
                Print("CASE 5");
                if (pxTokenInt5 >= 5)
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "550");            
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "500");
                }
                break;        
            case 6: 
                Print("CASE 6");
                if (pxTokenInt5 >= 5)
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "650");            
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "600");
                }
                break;        
            case 7: 
                Print("CASE 7");
                if (pxTokenInt5 >= 5)
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "750");            
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "700");
                }
                break;            
            case 8: 
                Print("CASE 8");
                if (pxTokenInt5 >= 5)
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "850");            
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "800");
                }
                break;        
            case 9: 
                Print("CASE 9");                
                if (pxTokenInt5 >= 5)
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "950");            
                }
                else
                {
                    px00LevelString = StringConcatenate(tmp00LevelString, "900");
                }            
                break;            
            default:
                Print("Not a digit.");
                break;
        }
    }
    else
    {
        switch(pxTokenInt)
        {
            case 0:             
                Print("CASE 0");
            /*
                if (Digits == 5)
                {
                    tmp00Level = StrToDouble(StringSubstr(pxString, 0, 5)) - 0.001;
                }
                
                if (Digits == 3)
                {
                    tmp00Level = StrToDouble(StringSubstr(pxString, 0, 5)) - 0.1;
                }
                        
                px00LevelString = DoubleToStr(tmp00Level, Digits);
            */
    
                px00LevelString = StringConcatenate(tmp00LevelString, "000");            
                break;
            case 1: 
                Print("CASE 1");
                px00LevelString = StringConcatenate(tmp00LevelString, "100");
                break;            
            case 2: 
                Print("CASE 2");
                px00LevelString = StringConcatenate(tmp00LevelString, "200");
                break;            
            case 3: 
                Print("CASE 3");
                px00LevelString = StringConcatenate(tmp00LevelString, "300");
                break;            
            case 4: 
                Print("CASE 4");
                px00LevelString = StringConcatenate(tmp00LevelString, "400");
                break;            
            case 5: 
                Print("CASE 5");
                px00LevelString = StringConcatenate(tmp00LevelString, "500");
                break;        
            case 6: 
                Print("CASE 6");
                px00LevelString = StringConcatenate(tmp00LevelString, "600");
                break;        
            case 7: 
                Print("CASE 7");
                px00LevelString = StringConcatenate(tmp00LevelString, "700");
                break;            
            case 8: 
                Print("CASE 8");
                px00LevelString = StringConcatenate(tmp00LevelString, "800");
                break;        
            case 9: 
                Print("CASE 9");
                px00LevelString = StringConcatenate(tmp00LevelString, "900");             
                break;            
            default:
                Print("Not a digit.");
                break;
        }
    }
    
    px00Level = StrToDouble(px00LevelString);
    Print("px00LevelString = ", px00LevelString);
    Print("px00Level = ", px00Level);
    
    stopLossLevel = px00Level + stopLoss;
    takeProfitLevel = px00Level - takeProfit;
    
    if (hiddenStops)
    {        
        // ticket = OrderSend(Symbol(), OP_SELLSTOP, numLots, px00Level, 3, 0, 0, NULL, 0, TimeCurrent() + 3600, clrDeepPink);
        ticket = OrderSend(Symbol(), OP_SELLSTOP, numLots, px00Level, 3, 0, 0, NULL, 0, 0, clrDeepPink);
   
        if (ticket < 0)
        {
            err = GetLastError();
            Print("OrderSend failed with error #", err, ", ", ErrorDescription(err), " - Pair: ", Symbol());
        }
        else
        {
            Print("Order placed successfully for pair: ", Symbol());
        }
    }
    else
    {               
        // ticket = OrderSend(Symbol(), OP_SELLSTOP, numLots, px00Level, 3, stopLossLevel, takeProfitLevel, NULL, 0, TimeCurrent() + 3600, clrDeepPink);
        ticket = OrderSend(Symbol(), OP_SELLSTOP, numLots, px00Level, 3, stopLossLevel, takeProfitLevel, NULL, 0, 0, clrDeepPink);
   
        if (ticket < 0)
        {
            err = GetLastError();
            Print("OrderSend failed with error #", err, ", ", ErrorDescription(err), " - Pair: ", Symbol());
        }
        else
        {
            Print("Order placed successfully for pair: ", Symbol());
        }
    }
    
    Print("stopLossLevel = ", stopLossLevel);
    Print("takeProfitLevel = ", takeProfitLevel);
        
    return(0);
}

double getLotSize(string pair, double risk, double stopSize)
{   
    double balance, pairPrice, euPrice, usPrice, lotSize;
    string depositCurrency, baseCurrency, counterCurrency;

    depositCurrency = AccountCurrency();
    baseCurrency = StringSubstr(pair, 0, 3);
    counterCurrency = StringSubstr(pair, 3, 3);    

    balance = AccountEquity();
   
    if (depositCurrency == "USD")
    {       
        if (counterCurrency == "USD") // e.g. AUDUSD
        {
            lotSize = (balance * risk) / (stopSize * MarketInfo(pair, MODE_LOTSIZE));
        }

        if (baseCurrency == "USD") // e.g. USDCAD
        {
            pairPrice = MarketInfo(pair ,MODE_BID);
            lotSize = ((pairPrice * balance) * risk) / (stopSize * MarketInfo(pair, MODE_LOTSIZE));
        }

        if ((counterCurrency != "USD") && (baseCurrency != "USD"))
        {
            if ((counterCurrency == "CAD") || (counterCurrency == "CHF") || (counterCurrency == "JPY")) // e.g. NZDJPY
            {
                usPrice = MarketInfo("USD" + counterCurrency, MODE_BID);
                lotSize = ((balance * risk) * (usPrice/1)) / (stopSize * MarketInfo(pair, MODE_LOTSIZE));
            }
            else // e.g. EURNZD
            {
                usPrice = MarketInfo(counterCurrency + "USD", MODE_BID);
                lotSize = ((balance * risk) * (1/usPrice)) / (stopSize * MarketInfo(pair, MODE_LOTSIZE));
            }
        }
    }
    
    if (depositCurrency == "EUR")
    {
        if (counterCurrency == "EUR")
        {
            lotSize = (balance * risk) / (stopSize * MarketInfo(pair, MODE_LOTSIZE));
        }

        if (baseCurrency == "EUR") // e.g. EURUSD
        {
            pairPrice = MarketInfo(pair, MODE_BID);
            lotSize = ((pairPrice * balance) * risk) / (stopSize * MarketInfo(pair, MODE_LOTSIZE));
        }

        if ((counterCurrency != "EUR") && (baseCurrency != "EUR"))
        {            
            euPrice = MarketInfo("EUR" + counterCurrency, MODE_BID);
            lotSize = ((euPrice * balance) * risk) / (stopSize * MarketInfo(pair, MODE_LOTSIZE));            
        }
    }
   
    // lotSize /= 3;   
    lotSize = NormalizeDouble(lotSize, 2);
   
    return (lotSize);  
}