//+---------------------------------------------------------------------------------+ //| calc.mq4 | //| Copyright © 2008, Borys Chekmasov | //| http://uatrader.blogspot.com | //+---------------------------------------------------------------------------------+ // Èíäèêàòîð ïðåäíàçíà÷åí äëÿ ðàñ÷åòà îðäåðîâ. | // Ñîçäàéòå íà ãðàôèêå òðè ëèíèè ñ èìåíàìè OPEN, STOP, PROFIT è | // ðàñïîëîæèòå èõ ñîîòâåòñòâåííî íà óðîâíÿõ, íà êîòîðûõ Âû ïëàíèðóåòå | // îòêðûâàòü (OPEN) îðäåð, óñòàíîâëèâàòü ñòîï (STOP) è òýéê-ïðîôèò (PROFIT). | // Åñëè íà ãðàôèêå íåò òàêèõ ëèíèé - èíäèêàòîð ñîçäàñò èõ àâòîìàòè÷åñêè | // âáëèçè òåêóùåé ðûíî÷íîé öåíû.  ñâîéñòâàõ èíäèêàòîðà çàäàéòå ðàçìåð ëîòà, | // êîòîðûì ïëàíèðóåòå îòêðûâàòüñÿ (calc_lots) è ðàçìåð êîìèññèè (comission) | // äëÿ ôüþ÷åðñîâ è CFD, åñëè ñäåëêà ïðîñ÷èòûâàåòñÿ ïî ýòèì èíñòðóìåíòàì | // (äëÿ ôüþ÷åðñîâ êîìèññèÿ â äîëëàðàõ çà ëîò, äëÿ CFD íà àêöèè â ïðîöåíòàõ). | // Åñëè â CFD íà àêöèÿõ îäèí ëîò ðàâåí 100 àêöèÿì, à íå îäíîé - óñòàíîâèòå | // ïàðàìåòð stock_in_lot íà 100. Äëÿ èíñòðóìåíòîâ â êîòîðûõ ïpîôèò ðàññ÷èòûâàåòñÿ | // â åâðî èëè ôóíòàõ (FDAX, FTSE), íóæíî ÷òîáû â îêíå îáçîðà | // ñèìâîëîâ áûëè îòîáðàæåíû ôîðåêñíûå ïàðû EURUSD èëè ñîîòâåòñòâåííî GPBUSD, | // òîãäà êóðñ áóäåò áðàòüñÿ àâòîìàòè÷åñêè èç ñîîòâåòñòâóþùèõ ôîðåêñíûõ ïàð. | // Àíàëîãè÷íî äëÿ êðîññîâ XXXYYY äîëæíû áûòü îòêðûòû ñîîòâåòñòâóþùèå îñíîâíûå | // ïàðû USDYYY (íàïðèìåð äëÿ GPBJPY â îêíå îáçîðà ðûíêà äîëæíà áûòü îòêðûòà USDJPY).| // Ïîñëå òîãî êàê Âû óñòàíîâèëè ëèíèè ñòîïîâ è ïðîôèòîâ â íóæíûå | // ïîëîæåíèÿ èíäèêàòîð àâòîìàòè÷åñêè îòîáðàçèò â âåðõíåì ëåâîì óãëó ãðàôèêà | // ðàçìåðû â äîëëàðàõ ïðèáûëè äëÿ ïðîôèòà, ðàçìåð ïîòåðü äëÿ ëîññà è ðàçìåð | // ïîääåðæèâàþùåé ìàðæè äëÿ âûñòàâëåííîãî êîëè÷åñòâà ëîòîâ è íà÷åðòèò íà ãðàôèêå | // ëèíèþ ïðè äîñòèæåíèè êîòîðîé ïðîèçîéäåò ñòîïàóò. Äëÿ ðàññ÷åòà | // íîâûõ çíà÷åíèé äîñòàòî÷íî áóäåò ïåðåòÿíóòü ëèíèè íà ãðàôèêå. | // Îáíîâëåíèå çíà÷åíèé ïðîèñõîäèò íà êàæäîì íîâîì òèêå, ïîýòîìó íà íèçêîëèêâèäíûõ | // èíñòðóìåíòàõ èëè â ïåðåðûâàõ ìåæäó ñåññèÿìè íàæìèìàéòå ïðàâîé êíîïêîé íà | // ãðàôèêå è âûáèðàéòå ïóíêò "îáíîâëåíèå" ÷òîá ïîëó÷èòü íîâûå çíà÷åíèÿ. | //+---------------------------------------------------------------------------------+ #property copyright "Copyright © 2008, Borys Chekmasov" #property link "http://uatrader.blogspot.com" #property indicator_chart_window extern double calc_lots = 0.1; //êîë-âî ëîòîâ extern double comission = 10; //êîìèññèÿ extern double stock_in_lot = 1; //êîëè÷åñòâî àêöèé â îäíîì ëîòå double eurusd_k = 1.5500; //çíà÷åíèå êóðñà EURUSD åñëè ñèìâîë âñå æå îòêëþ÷åí â îáçîðå ðûíêà double gpbusd_k = 1.9800; //çíà÷åíèå êóðñà GPBUSD åñëè ñèìâîë âñå æå îòêëþ÷åí â îáçîðå ðûíêà double usdjpy_k = 0.00958;//çíà÷åíèå êóðñà 1/USDJPY åñëè ñèìâîë âñå æå îòêëþ÷åí â îáçîðå ðûíêà double stopout_level; //óðîâåíü ñòîïàóòà double proff, preproff, preloss, kurs; double loss, start_margin, calc_margin,stopout_lvl2, stopout_lvl, marginsum, marginsum2, stopout_lvl3,stopout_lvl4; double tikk_v;//ñòîèìîñòü òèêà double tikk_s;//ðàçìåð òèêà double tikk_m;//ðåæèì ðàñ÷åòà ïðîôèòà double tikk_l;//ñòîèìîñòü ëîòà string Tiker; string comnts; double true_price;//áèðæåâîå ýêâèòè äëÿ èíñòðóìåíòîâ WHC-Broco int leverage_lev;//ïëå÷î // èíèöèàëèçàöèÿ int init() { Tiker = Symbol()+"#I"; true_price = 0; tikk_v = MarketInfo (Symbol(),MODE_TICKVALUE); tikk_s = MarketInfo (Symbol(),MODE_TICKSIZE); tikk_m = MarketInfo (Symbol(),MODE_PROFITCALCMODE); tikk_l = MarketInfo (Symbol(),MODE_LOTSIZE); stopout_level = AccountStopoutLevel(); leverage_lev = AccountLeverage(); start_margin = calc_lots*MarketInfo(Symbol(), MODE_MARGINREQUIRED); calc_margin = calc_lots*MarketInfo(Symbol(), MODE_MARGINMAINTENANCE); if ( calc_margin <= 0) { calc_margin=calc_lots*tikk_l/leverage_lev; } comnts = " "; if (MarketInfo("EURUSD",MODE_BID)>0) eurusd_k = MarketInfo("EURUSD",MODE_BID); if (MarketInfo("GPBUSD",MODE_BID)>0) gpbusd_k = MarketInfo("GPBUSD",MODE_BID); if (MarketInfo("USDJPY",MODE_BID)>0) usdjpy_k = 1/MarketInfo("USDJPY",MODE_BID); // èíñòðóìåíòû ñî ñòîèìîñòüþ ïóíêòà â îòëè÷íûõ îò äîëëàðà âàëþòàõ (WHC): kurs = 1; if (StringFind(Symbol(), "DAX", 0) >= 0) kurs = eurusd_k; if (StringFind(Symbol(), "FGB", 0) >= 0) kurs = eurusd_k; if (StringFind(Symbol(), "SPMIB", 0) >= 0) kurs = eurusd_k; if (StringFind(Symbol(), "FESX", 0) >= 0) kurs = eurusd_k; if (StringFind(Symbol(), "FSTX", 0) >= 0) kurs = eurusd_k; if (StringFind(Symbol(), "FTSE", 0) >= 0) kurs = gpbusd_k; if (StringFind(Symbol(), "NI300", 0) >= 0) kurs = usdjpy_k; if (StringFind(Symbol(), "NI225", 0) >= 0) kurs = usdjpy_k; if ((StringSubstr(Symbol(), 0, 1) == "C") && (StringLen(Symbol())==(3||1))) kurs = gpbusd_k; if (StringSubstr(Symbol(), 0, 2) == "AC") kurs = usdjpy_k; if (StringSubstr(Symbol(), 0, 2) == "RC") kurs = usdjpy_k; if (StringSubstr(Symbol(), 0, 2) == "SG") kurs = usdjpy_k; if (StringSubstr(Symbol(), 0, 2) == "RY") kurs = usdjpy_k; if (StringSubstr(Symbol(), 0, 2) == "CO") kurs = usdjpy_k; if (StringSubstr(Symbol(), 0, 2) == "RB") kurs = usdjpy_k; if (StringSubstr(Symbol(), 0, 3) == "TRB") kurs = usdjpy_k; if (StringSubstr(Symbol(), 0, 3) == "THU") kurs = usdjpy_k; if (StringSubstr(Symbol(), 0, 3) == "THO" ) kurs = usdjpy_k; // Ñîçäàíèå ëèíèé äëÿ âû÷èñëåíèé if (ObjectFind("OPEN")== -1) ObjectCreate("OPEN",OBJ_HLINE,0,0,Open[0]); if (ObjectFind("STOP")== -1) ObjectCreate("STOP",OBJ_HLINE,0,0,Open[3]); if (ObjectFind("PROFIT")== -1) ObjectCreate("PROFIT",OBJ_HLINE,0,0,Open[9]); return (0); } void deinit() { Comment(" "); ObjectDelete("STOPOUT"); } //îñíîâíîé öèêë int start() { //âû÷èñëåíèå áèðæåâîãî ýêâèòè WHC Broco int i; for(i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES )==true) { if (OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY) true_price = ((MarketInfo(Tiker,MODE_BID) - OrderOpenPrice())*(OrderLots())*(MarketInfo(Symbol(),MODE_TICKVALUE))/MarketInfo(Symbol(),MODE_TICKSIZE))*kurs+OrderCommission(); if (OrderType()==OP_SELL) true_price = ((OrderOpenPrice()-MarketInfo(Tiker,MODE_ASK))*(OrderLots())*(MarketInfo(Symbol(),MODE_TICKVALUE))/MarketInfo(Symbol(),MODE_TICKSIZE))*kurs+OrderCommission(); if (MarketInfo(Tiker,MODE_BID)<=0) true_price = 0; } else { true_price = 0; } } } //âû÷èñëåíèå çíà÷åíèé êàëüêóëÿòîðà preproff = kurs*MathAbs(ObjectGet("OPEN", OBJPROP_PRICE1)-ObjectGet("PROFIT", OBJPROP_PRICE1)); preloss = kurs*MathAbs(ObjectGet("OPEN", OBJPROP_PRICE1)-ObjectGet("STOP", OBJPROP_PRICE1)); marginsum = (stopout_level/100)*MathAbs(AccountFreeMargin()-calc_margin); marginsum2 = (stopout_level/100)*MathAbs(AccountBalance()-calc_margin); switch (tikk_m) { case 0: // Forex if (StringSubstr(Symbol(), 3, 3)=="USD") //ïàðû XXXUSD { proff = preproff*calc_lots*tikk_l; loss = preloss*calc_lots*tikk_l; stopout_lvl = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum/(calc_lots*tikk_l); stopout_lvl2 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum/(calc_lots*tikk_l); stopout_lvl3 = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum2/(calc_lots*tikk_l); stopout_lvl4 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum2/(calc_lots*tikk_l); if (start_margin<=0)start_margin = calc_lots*tikk_l/leverage_lev; } if (StringSubstr(Symbol(), 0, 3)=="USD") // ïàðû USDXXX { proff = preproff*calc_lots*tikk_l/ObjectGet("PROFIT", OBJPROP_PRICE1); loss = preloss*calc_lots*tikk_l/ObjectGet("STOP", OBJPROP_PRICE1); marginsum = (stopout_level/100)*MathAbs(AccountFreeMargin()-calc_margin/Bid); marginsum2 = (stopout_level/100)*MathAbs(AccountBalance()-calc_margin/Bid); stopout_lvl = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum/(calc_lots*tikk_l/Bid); stopout_lvl2 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum/(calc_lots*tikk_l/Bid); stopout_lvl3 = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum2/(calc_lots*tikk_l/Bid); stopout_lvl4 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum2/(calc_lots*tikk_l/Bid); if (start_margin==0)start_margin = (calc_margin)/Bid; } if (StringFind(Symbol(), "USD", 0) == -1) // êðîñêóðñû { if (MarketInfo("USD"+StringSubstr(Symbol(), 3, 3),MODE_BID)>0) { double tmpinfo = MarketInfo("USD"+StringSubstr(Symbol(), 3, 3),MODE_BID); marginsum = (stopout_level/100)*MathAbs(AccountFreeMargin()-calc_margin/tmpinfo); marginsum2 = (stopout_level/100)*MathAbs(AccountBalance()-calc_margin/tmpinfo); proff = preproff*calc_lots*tikk_l/tmpinfo ; loss = preloss*calc_lots*tikk_l/tmpinfo ; stopout_lvl = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum/(calc_lots*tikk_l/tmpinfo); stopout_lvl2 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum/(calc_lots*tikk_l/tmpinfo); stopout_lvl3 = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum2/(calc_lots*tikk_l/tmpinfo); stopout_lvl4 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum2/(calc_lots*tikk_l/tmpinfo); if (start_margin<=0)start_margin = (calc_lots*tikk_l/leverage_lev)/tmpinfo; } else { if (MarketInfo(StringSubstr(Symbol(), 0, 3)+"USD",MODE_BID)>0) { double tmpinfo2 = MarketInfo(StringSubstr(Symbol(), 0, 3)+"USD",MODE_BID); marginsum = (stopout_level/100)*MathAbs(AccountFreeMargin()-calc_margin*tmpinfo2); marginsum2 = (stopout_level/100)*MathAbs(AccountBalance()-calc_margin*tmpinfo2); proff = preproff*calc_lots*tikk_l*tmpinfo2 ; loss = preloss*calc_lots*tikk_l*tmpinfo2 ; stopout_lvl = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum/(calc_lots*tikk_l*tmpinfo2); stopout_lvl2 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum/(calc_lots*tikk_l*tmpinfo2); stopout_lvl3 = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum2/(calc_lots*tikk_l*tmpinfo2); stopout_lvl4 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum2/(calc_lots*tikk_l*tmpinfo2); if (start_margin<=0)start_margin = (calc_lots*tikk_l/leverage_lev)*tmpinfo2; } else { ////// int xxx = 1; if (StringSubstr(Symbol(), 3, 3)=="CAD") xxx=1.019; if (StringSubstr(Symbol(), 3, 3)=="JPY") xxx=105; if (StringSubstr(Symbol(), 3, 3)=="CHF") xxx=1.05; if (StringSubstr(Symbol(), 3, 3)=="AUD") xxx=1/0.933; if (StringSubstr(Symbol(), 3, 3)=="NZD") xxx=1/0.7820; if (StringSubstr(Symbol(), 3, 3)=="GPB") xxx=1/1.9850; if (StringSubstr(Symbol(), 3, 3)=="EUR") xxx=1/1.55; marginsum = (stopout_level/100)*MathAbs(AccountFreeMargin()-calc_margin/xxx); marginsum2 = (stopout_level/100)*MathAbs(AccountBalance()-calc_margin/xxx); proff = preproff*calc_lots*tikk_v/tikk_s; loss = preloss*calc_lots*tikk_v/tikk_s; stopout_lvl = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum/(calc_lots*tikk_v/(tikk_s/xxx)); stopout_lvl2 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum/(calc_lots*tikk_v/(tikk_s/xxx)); stopout_lvl3 = ObjectGet("OPEN", OBJPROP_PRICE1) + marginsum2/(calc_lots*tikk_v/(tikk_s/xxx)); stopout_lvl4 = ObjectGet("OPEN", OBJPROP_PRICE1) - marginsum2/(calc_lots*tikk_v/(tikk_s/xxx)); ///// } } } break; case 1: //CFD ñòîêè double temp3 = ObjectGet("OPEN", OBJPROP_PRICE1); proff = preproff*calc_lots*stock_in_lot - (comission/100)*calc_lots*temp3; loss = preloss*calc_lots*stock_in_lot + (comission/100)*calc_lots*temp3; stopout_lvl = temp3 + (marginsum-(comission/100)*calc_lots*temp3)/(calc_lots*stock_in_lot); stopout_lvl2 = temp3 - (marginsum-(comission/100)*calc_lots*temp3)/(calc_lots*stock_in_lot); stopout_lvl3 = temp3 + (marginsum2-(comission/100)*calc_lots*temp3)/(calc_lots*stock_in_lot); stopout_lvl4 = temp3 - (marginsum2-(comission/100)*calc_lots*temp3)/(calc_lots*stock_in_lot); break; default: // ôüþ÷è proff =( preproff*calc_lots*tikk_v/tikk_s) - (calc_lots*comission); loss = ( preloss*calc_lots*tikk_v/tikk_s) + (calc_lots*comission); stopout_lvl = ObjectGet("OPEN", OBJPROP_PRICE1) + (marginsum/kurs-calc_lots*comission)/(calc_lots*tikk_v/tikk_s); stopout_lvl2 = ObjectGet("OPEN", OBJPROP_PRICE1) - (marginsum/kurs-calc_lots*comission)/(calc_lots*tikk_v/tikk_s); stopout_lvl3 = ObjectGet("OPEN", OBJPROP_PRICE1) + (marginsum2/kurs-calc_lots*comission)/(calc_lots*tikk_v/tikk_s); stopout_lvl4 = ObjectGet("OPEN", OBJPROP_PRICE1) - (marginsum2/kurs-calc_lots*comission)/(calc_lots*tikk_v/tikk_s); marginsum = marginsum/kurs; marginsum2 = marginsum2/kurs; break; } //óñòàíîâêà ëèíèè ñòîïàóòà if (ObjectGet("OPEN", OBJPROP_PRICE1)>ObjectGet("PROFIT", OBJPROP_PRICE1)) { if (ObjectFind("STOPOUT") == -1) ObjectCreate("STOPOUT" , OBJ_HLINE,0,0,stopout_lvl); ObjectSet("STOPOUT", OBJPROP_PRICE1, stopout_lvl); if (ObjectFind("STOPOUT2") == -1) ObjectCreate("STOPOUT2" , OBJ_HLINE,0,0,stopout_lvl3); ObjectSet("STOPOUT2", OBJPROP_PRICE1, stopout_lvl3); } else { if (ObjectFind("STOPOUT") == -1) ObjectCreate("STOPOUT" , OBJ_HLINE,0,0,stopout_lvl2); ObjectSet("STOPOUT", OBJPROP_PRICE1, stopout_lvl2); if (ObjectFind("STOPOUT2") == -1) ObjectCreate("STOPOUT2" , OBJ_HLINE,0,0,stopout_lvl4); ObjectSet("STOPOUT2", OBJPROP_PRICE1, stopout_lvl4); } // ïîÿñíèòåëüíûå òåêñòà íà ëèíèè ObjectSetText("STOPOUT", "Óðîâåíü ñòîïàóòà ïî ýêâèòè -"+DoubleToStr(marginsum, 2)+"USD", 10, "Times New Roman", Green); ObjectSetText("STOPOUT2", "Óðîâåíü ñòîïàóòà ïî áàëàíñó -"+DoubleToStr(marginsum2, 2)+"USD", 10, "Times New Roman", Green); ObjectSetText("OPEN", "Open "+DoubleToStr(calc_lots,2)+" ëîòîâ", 10, "Times New Roman", Green); ObjectSetText("STOP", "Stop "+DoubleToStr(loss, 2), 10, "Times New Roman", Green); ObjectSetText("PROFIT", "Profit "+DoubleToStr(proff, 2), 10, "Times New Roman", Green); //âûâîä â ëåâûé âåðõíèé óãîë çíà÷åíèé êàëüêóëÿòîðà comnts = "Äëÿ "+ DoubleToStr(calc_lots,2) + " ëîòîâ Ïðîôèò: " + DoubleToStr(proff,2) +" ("+DoubleToStr(proff*100/AccountEquity(), 2)+"%) "+ " Ëîññ: " + DoubleToStr(loss, 2)+" ("+DoubleToStr(loss*100/AccountEquity(), 2)+"%) "; if (start_margin>0) comnts = comnts + "Ñòàðòîâàÿ ìàðæà: "+DoubleToStr(start_margin,2)+" USD"; if (true_price!=0) comnts = comnts + " Ýêâèòè: " + DoubleToStr(true_price,2); Comment(comnts); return(0); }
Sample
Analysis
Market Information Used:
Series array that contains open prices of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
Other Features: