Суть скрипта это выставлять общий стоплосс или тейкпрофит по всей позиции когда очень много ордеров, он накидывается на график и там есть мерцающая линия, куда ее потянешь там можно выставить стоп или тп, когда ее перетянул в нужное место нажимаешь удалить выскакивает окошко в нем два варианта удалить или отмена, если нажать удалить скрипт выставит тп или сл на уровне линии если отмена просто удалится и ничего не изменится. при перетаскивании линии в верху скрипт считает какой будет профит и риск от депозита на месте расположения линии, в низу считает лотность и расстояние в пунктах от цены до линии. это я рассказал как он работает. а теперь о проблеме.
Этот скрипт все валютные пары считает все правильно, а золото и нефть не хочет правильно считать профит который отображается в верхней части экрана я уже перепробовал всякие варианты (сам немного пишу) но я уже не знаю что делать где зарыта собака, почему валюты считает правильно а золото нет, но уровни выставляет правильно.
- Код: выделить все
//+------------------------------------------------------------------+
//| Общ СЛ_ТП .mq4 |
//| ZVARICHYRA |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "ZVARICHYRA"
#property link "http://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
extern color clr = Red; // Цвет сообщения на экране (Баланс и Профит)
extern int font = 12; // Размер шрифта сообщения на экране (Баланс и Профит)
double STL = 0;
int iii = 0;
double lots = 0;
string prof_risk,res, res1, pp, res2;
int i=0;
//+------------------------------------------------------------------+
void OnDeinit(const int reason){Comment (" ");ObjectDelete ("10");ObjectDelete ("Label");ObjectDelete("nm");}
//---------------------------------
void OnStart()
{
if (IsConnected()) {
if (ObjectFind("Label") == (-1)) {linebye();}
if (ObjectFind("10") == (-1)) {ObjectCreate ("10",OBJ_TEXT,0,Time[WindowBarsPerChart( )/3] , WindowPriceMax(0) );
ObjectSetText("10", DoubleToStr (Close[4],4), font, "Arial", clr);}
while (ObjectFind("Label")!=(-1) ) {
STL =NormalizeDouble( ObjectGet("Label", 1),Digits); text();
Comment("\n"+"Значение линии: " +DoubleToStr(STL,Digits)
/* +"\n" + "Суммарный лот: " +DoubleToStr(lots(),2)
+ "\n"+ "Прибыль/убыток на уровне линии: " + res1
+ " и размер баланса: " + res +"\n"
+ "Для прекращения работы скрипта удалите мерцающую линию "*/ );
if (iii == 5) {Sleep (30); ObjectSet( "Label", 6, Blue); WindowRedraw( );} else Sleep (30);
if (iii == 10) {Sleep (30); ObjectSet( "Label", 6, White); WindowRedraw( );} else Sleep (30);
if (iii == 10) iii = 0; iii = iii+1;
}
if (lots() != 0) {
if (MessageBox (" Установить уровень закрытия ордеров по цене мигающей линии??? ","Скрипт интересуется:",1)==1) startset();
}
}
else MessageBox ("Нет соединения с сервером!!!"," Скрипт сообщает:",0x00000000);
}
//+------------------------------------------------------------------+
int linebye() {// Рисуем линию (которая мигает)
ObjectDelete( "Label");
ObjectCreate( "Label", OBJ_HLINE, 0, 0, (Bid-Point*(MarketInfo(Symbol(), MODE_STOPLEVEL))) );
ObjectSet( "Label", 6, White); ObjectSet( "Label", 8, 2); WindowRedraw( ) ;
return(0); }
//+------------------------------------------------------------------+
string text() {
if (funkprice() != 0){
res = DoubleToStr ((AccountBalance( ) - (((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)*lots()*(-1))),0);
res1 = DoubleToStr (( (((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)*lots())),2);
res2 = DoubleToStr ((100*(((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)*lots()))/AccountBalance(),2);
pp = DoubleToStr ( (STL-MarketInfo(Symbol(),MODE_BID))/Point,0); }
else {res = " Суммарный лот = 0! "; res1 = ""; res2 = "";}
if (((((STL - funkprice())/Point)*MarketInfo(Symbol(), MODE_TICKVALUE)*lots()))>0) { clr = Blue; prof_risk="Профит";} else {clr = Red;prof_risk="Риск"; }
ObjectSetText("10"," "+prof_risk+" "+res1+" "+AccountCurrency( )+" ("+res2+"% от Depo ) " , font, "Arial", clr);
SetLabel("nm","ПУНКТОВ "+pp +", ЛОТ: " + DoubleToStr(lots(),2)+ " ",Red,10,10,3,9);
WindowRedraw( ) ;
return((string) 0); }
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
double funkprice() {
double price=0;
if (lots()!=0)
{
if (lots()>0) price = MarketInfo(Symbol(),MODE_BID) - ((symbolprofit()/(MarketInfo(Symbol(), MODE_TICKVALUE)*lots()))*Point);
if (lots()<0) price = MarketInfo(Symbol(),MODE_ASK) - ((symbolprofit()/(MarketInfo(Symbol(), MODE_TICKVALUE)*lots()))*Point);
}
return (price); }
//*******************************************
int startset() { int kol=0; int kolOK=0; i=0; double ilots=0;
for (i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY)
{
ilots=ilots+OrderLots();
kol=kol+1;
}
if (OrderType()==OP_SELL)
{
ilots=ilots-OrderLots();
kol=kol+1;
}
}
//-----
Alert ("!!! Пожалуйста дождитель окончания работы скрипта!");
int resi = 0;
for (i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol()) continue;
if (STL>Ask)
{ if (OrderType()==OP_BUY) {if (STL == OrderTakeProfit()) resi=resi+1; else { if (OrderModify(OrderTicket(),0,OrderStopLoss(),STL,0,CLR_NONE)) resi = resi+1;} }
if (OrderType()==OP_SELL){if (STL == OrderStopLoss()) resi=resi+1; else { if ( OrderModify(OrderTicket(),0,(STL+(Ask-Bid)),OrderTakeProfit(),0,CLR_NONE)) resi = resi+1;} } }
if (STL<Bid)
{ if (OrderType()==OP_BUY) {if (STL == OrderStopLoss()) resi=resi+1; else { if ( OrderModify(OrderTicket(),0,(STL-(Ask-Bid)),OrderTakeProfit(),0,CLR_NONE)) resi = resi+1;} }
if (OrderType()==OP_SELL){if (STL == OrderTakeProfit()) resi=resi+1; else { if (OrderModify(OrderTicket(),0,OrderStopLoss(),STL,0,CLR_NONE)) resi = resi+1;} } }
}
Alert ("***************************************************");
if (kol==resi) Alert ("Все ордера успешно изменены! ОК!"); else Alert ("!!! Внимание!!! Не удалось изменить - " +((string)(kol - resi))+ " ордера из "+(string)kol+" имеющихся");
Alert ("************ информация от скрипта ************");
return(0);
}
double lots()
{
double sumlots = 0;
for (i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY)
{
sumlots=sumlots+OrderLots();
}
if (OrderType()==OP_SELL)
{
sumlots=sumlots-OrderLots();
}
}
return(sumlots);
}
//**************************
double symbolprofit() // profit по ордерам текущего инструмента (без свопов и комиссий)
{
double sprofit = 0;
for (i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol()) continue;
sprofit = sprofit + OrderProfit( );
}
return(sprofit);
}
//+------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
ObjectSetText(nm, tx, fs);
ObjectSet(nm, OBJPROP_COLOR , cl);
ObjectSet(nm, OBJPROP_XDISTANCE, xd);
ObjectSet(nm, OBJPROP_YDISTANCE, yd);
ObjectSet(nm, OBJPROP_CORNER , cr);
ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//-------------