Добрый день.
Сделал вот такой индюк информационного типа для себя. Но вычисления для него есть и в советнике и в самом индикаторе.
Вопрос: как сделать проще чтобы одни и те же данные не пересчитывать по несколько раз?
Закинуть всё в советник или наоборот лучше всё брать из индикатора?
Привет.
Советник не может выполнять функции индюка!
Решение простое. В индикатор добавь внешний буфер (это после внешних переменных "extern int nameVar = 0"), и советником получай эти значения через iCustom().
Вот ссылка для индюка https://book.mql4.com/ru/samples/icustom
Привет.
Советник не может выполнять функции индюка!
Решение простое. В индикатор добавь внешний буфер (это после внешних переменных "extern int nameVar = 0"), и советником получай эти значения через iCustom().
Вот ссылка для индюка https://book.mql4.com/ru/samples/icustom
С первого раза не понял. Наверное в танке :((
А можно в индюке показать?
//+------------------------------------------------------------------+ //| MILANA_PROFIT_INFO.mq4 | //| Isaev Sergey | //| serj.7777@mail.ru | //+------------------------------------------------------------------+ #property copyright "Isaev Sergey" #property link "serj.7777@mail.ru" #property indicator_chart_window string mmm, nnn; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators //---- return(0); } int CountBuy() { int countbuy=0; for (int i=OrdersTotal(); i>=0; i--) { OrderSelect(i,SELECT_BY_POS, MODE_TRADES); if (OrderSymbol () !=Symbol()) continue; if (OrderSymbol () ==Symbol()) if (OrderType()==OP_BUY) countbuy ++; } return(countbuy); } int CountSell() { int countsell=0; for (int i=OrdersTotal(); i>=0; i--) { OrderSelect(i,SELECT_BY_POS, MODE_TRADES); if (OrderSymbol () !=Symbol()) continue; if (OrderSymbol () ==Symbol()) if (OrderType()==OP_SELL) countsell ++; } return(countsell); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- ObjectDelete("Profit"); ObjectDelete("Sell"); ObjectDelete("Buy"); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { //int counted_bars=IndicatorCounted(); double profit = NormalizeDouble((AccountProfit()*100)/AccountBalance(),2); if (profit<0) { mmm="УБЫТОК "; //nnn=" Допустимый -1.00%"; } else { mmm="ПРИБЫЛЬ "; //nnn=""; } //---- string PROFIT=mmm + DoubleToStr(profit,2) +"%";//+nnn; ObjectCreate("Profit", OBJ_LABEL, 0, 0, 0); ObjectSet("Profit", OBJPROP_CORNER,1); ObjectSet("Profit", OBJPROP_XDISTANCE,1); ObjectSet("Profit", OBJPROP_YDISTANCE,10); ObjectSetText("Profit", PROFIT,16,"Garamond",Yellow); //---- string ORDER= "Ордеров на рынке " + DoubleToStr(OrdersTotal(),0); ObjectCreate("Order", OBJ_LABEL, 0, 0, 0); ObjectSet("Order", OBJPROP_CORNER,1); ObjectSet("Order", OBJPROP_XDISTANCE,1); ObjectSet("Order", OBJPROP_YDISTANCE,30); ObjectSetText("Order",ORDER,16,"Garamond",DeepPink); //---- string BUY= "Ордеров Buy " + DoubleToStr(CountBuy(),0)+"/Максимум "+"10"; ObjectCreate("Buy", OBJ_LABEL, 0, 0, 0); ObjectSet("Buy", OBJPROP_CORNER,1); ObjectSet("Buy", OBJPROP_XDISTANCE,1); ObjectSet("Buy", OBJPROP_YDISTANCE,50); ObjectSetText("Buy",BUY,16,"Garamond",Aqua); //---- string SELL= "Ордеров Sell " + DoubleToStr(CountSell(),0)+"/Максимум "+"10"; ObjectCreate("Sell", OBJ_LABEL, 0, 0, 0); ObjectSet("Sell", OBJPROP_CORNER,1); ObjectSet("Sell", OBJPROP_XDISTANCE,1); ObjectSet("Sell", OBJPROP_YDISTANCE,70); ObjectSetText("Sell",SELL,16,"Garamond",Red); return(0); } //+------------------------------------------------------------------+
//+------------------------------------------------------------------+ //| MILANA_PROFIT_INFO.mq4 | //| Isaev Sergey | //| serj.7777@mail.ru | //+------------------------------------------------------------------+ #property copyright "Isaev Sergey" #property link "serj.7777@mail.ru" #property indicator_chart_window #property indicator_buffers 1 // Количество буферов <<<<<<<<<<<<<<<< строчка добавлена string mmm, nnn; double buf_0[]; // первый буфер (номерация начиается с нуля)<<<<<<<<<<<<<<<< строчка добавлена //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators //---- return(0); } int CountBuy() { int countbuy=0; for (int i=OrdersTotal(); i>=0; i--) { OrderSelect(i,SELECT_BY_POS, MODE_TRADES); if (OrderSymbol () !=Symbol()) continue; if (OrderSymbol () ==Symbol()) if (OrderType()==OP_BUY) countbuy ++; } return(countbuy); } int CountSell() { int countsell=0; for (int i=OrdersTotal(); i>=0; i--) { OrderSelect(i,SELECT_BY_POS, MODE_TRADES); if (OrderSymbol () !=Symbol()) continue; if (OrderSymbol () ==Symbol()) if (OrderType()==OP_SELL) countsell ++; } return(countsell); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- ObjectDelete("Profit"); ObjectDelete("Sell"); ObjectDelete("Buy"); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { //int counted_bars=IndicatorCounted(); double profit = NormalizeDouble((AccountProfit()*100)/AccountBalance(),2); if (profit<0) { mmm="УБЫТОК "; //nnn=" Допустимый -1.00%"; } else { mmm="ПРИБЫЛЬ "; //nnn=""; } //---- string PROFIT=mmm + DoubleToStr(profit,2) +"%";//+nnn; buf_0[0]=profit; // заносим в буфер <<<<<<<<<<<<<<<< строчка добавлена Alert(PROFIT); // Это можно убрать :) <<<<<<<<<<<<<<<< строчка добавлена ObjectCreate("Profit", OBJ_LABEL, 0, 0, 0); ObjectSet("Profit", OBJPROP_CORNER,1); ObjectSet("Profit", OBJPROP_XDISTANCE,1); ObjectSet("Profit", OBJPROP_YDISTANCE,10); ObjectSetText("Profit", PROFIT,16,"Garamond",Yellow); //---- string ORDER= "Ордеров на рынке " + DoubleToStr(OrdersTotal(),0); ObjectCreate("Order", OBJ_LABEL, 0, 0, 0); ObjectSet("Order", OBJPROP_CORNER,1); ObjectSet("Order", OBJPROP_XDISTANCE,1); ObjectSet("Order", OBJPROP_YDISTANCE,30); ObjectSetText("Order",ORDER,16,"Garamond",DeepPink); //---- string BUY= "Ордеров Buy " + DoubleToStr(CountBuy(),0)+"/Максимум "+"10"; ObjectCreate("Buy", OBJ_LABEL, 0, 0, 0); ObjectSet("Buy", OBJPROP_CORNER,1); ObjectSet("Buy", OBJPROP_XDISTANCE,1); ObjectSet("Buy", OBJPROP_YDISTANCE,50); ObjectSetText("Buy",BUY,16,"Garamond",Aqua); //---- string SELL= "Ордеров Sell " + DoubleToStr(CountSell(),0)+"/Максимум "+"10"; ObjectCreate("Sell", OBJ_LABEL, 0, 0, 0); ObjectSet("Sell", OBJPROP_CORNER,1); ObjectSet("Sell", OBJPROP_XDISTANCE,1); ObjectSet("Sell", OBJPROP_YDISTANCE,70); ObjectSetText("Sell",SELL,16,"Garamond",Red); return(0); } //+------------------------------------------------------------------+
Остальное делай сам :)
гм.. покажите новый код..
Вот
void MILANA_INFO(double profit, int openbuy, int opensell) { string mmm; if (profit<0) { mmm="УБЫТОК "; } else { mmm="ПРИБЫЛЬ "; } //---- string _profit = mmm + DoubleToStr(profit,2) +"%"; string _order = "Ордеров на рынке " + DoubleToStr(OrdersTotal(),0); string _buy = "Ордеров Buy " + DoubleToStr(openbuy,0)+"/Максимум "+DoubleToStr(MaxBuy ,0); string _sell = "Ордеров Sell " + DoubleToStr(opensell,0)+"/Максимум "+DoubleToStr(MaxSell,0); //---- ObjectSetText("_profit",_profit,16,"Garamond",Yellow); ObjectSet("_profit", OBJPROP_CORNER,1); ObjectSet("_profit", OBJPROP_XDISTANCE,1); ObjectSet("_profit", OBJPROP_YDISTANCE,10); //---- ObjectSetText("_order",_order,16,"Garamond",DeepPink); ObjectSet("_order", OBJPROP_CORNER,1); ObjectSet("_order", OBJPROP_XDISTANCE,1); ObjectSet("_order", OBJPROP_YDISTANCE,30); //---- ObjectSetText("_buy",_buy,16,"Garamond",Aqua); ObjectSet("_buy", OBJPROP_CORNER,1); ObjectSet("_buy", OBJPROP_XDISTANCE,1); ObjectSet("_buy", OBJPROP_YDISTANCE,50); //---- ObjectSetText("_sell",_sell,16,"Garamond",Red); ObjectSet("_sell", OBJPROP_CORNER,1); ObjectSet("_sell", OBJPROP_XDISTANCE,1); ObjectSet("_sell", OBJPROP_YDISTANCE,70); return(0); }
а ObjectCreate куда потеряли ?
int init() { //---- indicators ObjectCreate("_profit", OBJ_LABEL, 0, 0, 0); ObjectCreate("_order", OBJ_LABEL, 0, 0, 0); ObjectCreate("_buy", OBJ_LABEL, 0, 0, 0); ObjectCreate("_sell", OBJ_LABEL, 0, 0, 0); //---- return(0); }
это перед Start
int deinit() { Comment(""); ObjectDelete("_profit"); ObjectDelete("_order"); ObjectDelete("_buy"); ObjectDelete("_sell"); return(0); }это после Start прописано....
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день.
Сделал вот такой индюк информационного типа для себя. Но вычисления для него есть и в советнике и в самом индикаторе.
Вопрос: как сделать проще чтобы одни и те же данные не пересчитывать по несколько раз?
Закинуть всё в советник или наоборот лучше всё брать из индикатора?