#property  copyright "Copyright © 2011, sangmane."
#property  link      "sangmane@forexfactory.com" 
  
#import "EasyOrder.dll"
   int EasyOrder_Submit(int hwnd, double &alot[]);
   
#include <stdlib.mqh>
#include <stderror.mqh>

//settings
int MagicNumber = 8051;
int Slippage = 9;
string TradeComment = "Easy Order";
double LotUnit;

int start()
{	
	string obj = "EASYORDER_NEW_";
	string aorder[6] = {"Buy", "Sell", "Buy Limit", "Sell Limit", "Buy Stop", "Sell Stop"};
	double alot[1]={0};
	double price, sl, tp;

	double pip = Point;
	if(Digits==3 || Digits==5) pip = 10*Point;
	LotUnit = MarketInfo(Symbol(),MODE_LOTSIZE);

	int i;
	
	int hwnd = WindowHandle(Symbol(),Period());
	int trade = EasyOrder_Submit(hwnd, alot);
	bool RiskBased = (trade & 0x100) > 0;
	trade = trade & 0xff;
	while(True) {	
		if(trade<0) {
			break;
		}
		trade -= 1;
		if(trade<0) {
			break;
		}
		
		double lot = alot[0];
		sl = NormalizeDouble(ObjectGet(obj+"SL",OBJPROP_PRICE1),Digits);
		/////////////////tp = NormalizeDouble(ObjectGet(obj+"TP",OBJPROP_PRICE1),Digits);
		RefreshRates();
		switch(trade) {
			case OP_BUY:			
				price = Ask; break;
			case OP_SELL:
				price = Bid; break;
			default:
				price = NormalizeDouble(ObjectGet(obj+"Price",OBJPROP_PRICE1),Digits); break;
		}
		if(price==0) {
			break;
		}
		if(RiskBased) {
			if(sl==0) {
				break;
			}
			lot = RiskToLot(lot, price, sl);
		}
		lot = MathRound(lot/MarketInfo(Symbol(),MODE_LOTSTEP))*MarketInfo(Symbol(),MODE_LOTSTEP);
		lot = MathMax(lot, MarketInfo(Symbol(),MODE_MINLOT));
		lot = MathMin(lot, MarketInfo(Symbol(),MODE_MAXLOT));

		int ticket;
		color clr = Blue;
		if(MathMod(trade,2)>0) clr = Red;
		   
		   if(trade==OP_BUYSTOP) 
			{ticket=OrderSend(Symbol(),trade,lot,(price+Ask-Bid),Slippage,sl,tp,TradeComment,MagicNumber,0,clr);	 }
			
			if(trade==OP_SELLSTOP) 
			{ticket=OrderSend(Symbol(),trade,lot,price,Slippage,(sl+(Ask-Bid)),tp,TradeComment,MagicNumber,0,clr);	 }
			
	      if(trade==OP_BUYLIMIT) 
			{ticket=OrderSend(Symbol(),trade,lot,(price+Ask-Bid),Slippage,sl,tp,TradeComment,MagicNumber,0,clr);	 }
			
			if(trade==OP_SELLLIMIT) 
			{ticket=OrderSend(Symbol(),trade,lot,price,Slippage,(sl+(Ask-Bid)),tp,TradeComment,MagicNumber,0,clr);	 
			

		
		
			break;
		}	

	}
	//delete Order lines
	for(i=ObjectsTotal()-1; i>=0; i--) {
		obj = ObjectName(i);
		if(StringFind(obj,"EASYORDER_NEW",0)>=0) ObjectDelete(obj);
	}
	InitLines();
	return(0);
}
//+------------------------------------------------------------------+
void InitLines()
{
	string obj;
	int i, ticket;

	for(i=0; i<OrdersTotal(); i++) {
		OrderSelect(i,SELECT_BY_POS);
		if(OrderSymbol()==Symbol()) {
			ticket = OrderTicket();
			obj = "EASYORDER_MOD_SL_#"+ticket;
			if(ObjectFind(obj)>=0)	ObjectMove(obj,0,Time[0],OrderStopLoss());
			else DrawLine("SL",ticket,OrderStopLoss());
			obj = "EASYORDER_MOD_TP_#"+ticket;
			if(ObjectFind(obj)>=0)	ObjectMove(obj,0,Time[0],OrderTakeProfit());
			else DrawLine("TP",ticket,OrderTakeProfit());
			if(OrderType()>OP_SELL) {
				obj = "EASYORDER_MOD_PRICE_#"+ticket;
				if(ObjectFind(obj)>=0)	ObjectMove(obj,0,Time[0],OrderOpenPrice());
				else DrawLine("PRICE",ticket,OrderOpenPrice());				
			}
		}
	}
}

double RiskToLot(double risk, double price, double sl) 
{
	if(price==sl) return(0);
	double lot = 0; 
	double delta = MathAbs(price-sl);
	double balance = AccountBalance();
	if(balance==0) return(0);
	risk = risk;
	Print("LotUnit: ",LotUnit);
	lot = risk/(delta+(Ask-Bid))/LotUnit;
	string baseSymbol = StringSubstr(Symbol(),3,3);
	string faceSymbol = StringSubstr(Symbol(),0,3);
	string suffix = "";
	if(StringLen(Symbol())>6) suffix = StringSubstr(Symbol(),6,StringLen(Symbol())-6);
	if(baseSymbol=="USD") {
		return(lot);
	}

	if(faceSymbol=="USD") {
		Print(Symbol());
		return(lot*sl);
	}
	
	//USDXXX
	string symbol = "USD"+baseSymbol+suffix;
	if(MarketInfo(symbol,MODE_ASK)>0) return(lot*MarketInfo(symbol,MODE_ASK));
	symbol = baseSymbol+"USD"+suffix;
	if(MarketInfo(symbol,MODE_BID)>0) {
		Print("Symbol XXXUSD: ",symbol);
		return(lot/MarketInfo(symbol,MODE_BID));	
	}
	return(lot);
}

void DrawLine(string type, int ticket, double level)
{
	string obj = "EASYORDER_MOD_"+type+"_#"+ticket;
	color clr = Red;
	if(type=="PRICE") clr = LimeGreen;
	//else if(type=="TP") clr = Blue;
	ObjectCreate(obj,OBJ_HLINE,0,Time[0],level,0,0);
	ObjectSet(obj,OBJPROP_COLOR,clr);
	ObjectSet(obj,OBJPROP_STYLE,STYLE_DASHDOT);
}

