Ваши вопросы по языку MQL4

gince

Местный знаток
Есть два индикатора. Они почти одинаковы. В первом - цена открытия, во втором - по выбору. Хотел их сделать в одном, но где то ошибся. Помогите сделать индикатор с двух один.
 

Вложения

  • Turbo_JRSX_v1-OPEN.mq4
    7,7 КБ · Просмотры: 26
  • Turbo_JRSX_wAppliedPrice.mq4
    4,2 КБ · Просмотры: 26
  • Turbo_2JRSX_wAppliedPrice.mq4
    5,5 КБ · Просмотры: 27

AlexeyVik

Программист mql4 mql5
Он не будет работать по всем символам одновременно! -Только на том, на котором стоит.
PHP:
ObjectCreate(0,name,OBJ_HLINE,0,0,price);
- 0-идентификатор графика в терминале и у тебя только текущий указан (0). Чтобы трал работал по всем открытым графикам, нужно считывать ID графика и по нему уже рисовать линию на нужном графике, а не на текущем. Только я однажды пытался сделать считывание ID открытых графиков и терминал выдавал только 0 первого графика, а все остальные были EMPTY и фиг, что дальше сделаешь. Поэтому я нашел другой способ виртуального трала по всем ордерам всех графиков - думай дальше, студент.;):D
Странно что не получилось.
ChartNext возвращает идентификатор графика, следующего за указанным.
 

vladradon

Программист
Странно что не получилось.
ChartNext возвращает идентификатор графика, следующего за указанным.
Вот и мне странно, но может это тогда (год назад примерно) не работал и может только в том терминале, где пробовал сделать автопереключение графиков. ChartNext и выдавал всегда EMPTY - там сложно ошибиться в коде, тем более, что он выложен в примере в документации.
 
Последнее редактирование:

vladradon

Программист
Есть два индикатора. Они почти одинаковы. В первом - цена открытия, во втором - по выбору. Хотел их сделать в одном, но где то ошибся. Помогите сделать индикатор с двух один.
Я не знаю точно, что он должен показывать, но увидишь, что я изменил. Там смысл в том, что некоторые переменные при расчете каждого индюка должны сохраняться в течение всего расчета, а они обнулялись при каждом обращении к функции расчета. Ну и расчеты должны вестись в отдельном цикле для каждого индюка, чтобы переменные одного индюка тут же не пересчитывались другим, т.к. они общие для функции расчета.
 

Вложения

  • Turbo_2JRSX_wAppliedPrice.mq4
    5,6 КБ · Просмотры: 26
Последнее редактирование:

vladradon

Программист
Есть два индикатора. Они почти одинаковы. В первом - цена открытия, во втором - по выбору. Хотел их сделать в одном, но где то ошибся. Помогите сделать индикатор с двух один.
Поспешил немного - забыл, что перед каждым расчетом эти переменные нужно обнулить (только недавно об этом писал здесь).:D
А то графики какие-то не как в оригинале получаются.
 

Вложения

  • Turbo_2JRSX_wAppliedPrice.mq4
    5,9 КБ · Просмотры: 34

DomovenokBrest

♔♕♖♗♘♙
Поспешил немного - забыл, что перед каждым расчетом эти переменные нужно обнулить (только недавно об этом писал здесь).:D
А то графики какие-то не как в оригинале получаются.

Креативненько так получилось :)
 

Вложения

  • Снимок.PNG
    Снимок.PNG
    75,5 КБ · Просмотры: 58
  • Снимок1.PNG
    Снимок1.PNG
    98,9 КБ · Просмотры: 57
прошу прощенья.но у меня ничего не получается.вот индикатор и скрипт .как их объеденить?

//+------------------------------------------------------------------+
//| ScriptLocker.mq4 |
//| jonxxx |
//+------------------------------------------------------------------+
#property copyright "..."
#property link "..."

//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
void start()
{
double Lots=0;
for(int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS))
continue;
if(OrderSymbol()!=Symbol())
continue;
if(OrderType()==OP_BUY)
Lots+=OrderLots();
if(OrderType()==OP_SELL)
Lots-=OrderLots();
}
if(Lots>0)
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,NULL,Red);
if(Lots<0)
OrderSend(Symbol(),OP_BUY,-(Lots),Ask,3,0,0,NULL,Blue);
}
//+------------------------------------------------------------------+


индикатор

//+------------------------------------------------------------------+
//| Link.mq4 |
//| Yuriy Tokman (YTG) |
//+------------------------------------------------------------------+
#property copyright
#property link
#property version "1.00"
#property strict
#property indicator_chart_window

#import "shell32.dll"
int ShellExecuteW(int hwnd, string Operation,string File,string Parameters,string Directory,int ShowCmd);
#import

input string site = "https://ru.investing.com/economic-calendar/";

//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int OnInit()
{
//--- отображение индикаторных буферов
Button("Link",clrDimGray,"ЗАМОК",51,73);
//---
return(INIT_SUCCEEDED);
}
//---
void OnDeinit(const int reason)
{
//---
ObjectDelete(0,"Link");
}
//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
//--- возвращаемое значение prev_calculated для следующего вызова
return(rates_total);
}
//----
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if(id==CHARTEVENT_OBJECT_CLICK){
string clickedChartObject=sparam;
if(clickedChartObject=="Link"){
Button("Link",clrSlateGray,"ЕСТЬ",51,73);
ShellExecuteW(0,"Open", site, "", "", 1);
}
ChartRedraw();}}
//+------------------------------------------------------------------+
bool Button(string name="",color clr=clrBlack,string _txt = "", int x=0, int y=0, int xs=50,int ys=15, int sz = 9){

if(ObjectFind(name)>=0)ObjectDelete(name);

ResetLastError();
if(!ObjectCreate(0,name,OBJ_BUTTON,0,0,0))
{
Print(name,__FUNCTION__, ": Error = ",GetLastError());
return(false);
}
ObjectSetInteger(0,name,OBJPROP_COLOR,clrBlack);
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,clrGold
);
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
ObjectSetInteger(0,name,OBJPROP_XSIZE,xs);
ObjectSetInteger(0,name,OBJPROP_YSIZE,ys);
ObjectSetString(0,name,OBJPROP_FONT,"Arial");
ObjectSetString(0,name,OBJPROP_TEXT,_txt);
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,sz);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);

return(true);
}

очень надо помогите. горячие кнопки не подходят.СПАСИБО.
 
Последнее редактирование модератором:

vladradon

Программист
прошу прощенья.но у меня ничего не получается.вот индикатор и скрипт .как их объеденить?
И не получится, т.к. в скрипте ордерные функции и в индикаторе они работать не будут. Я набросал по-быстрому твой скрипт и добавил в него 2 кнопки. Одна кнопка "Start" - одноразовый запуск скрипта - она нажимается и после выполнения скрипта отжимается сама. Вторая "Exit" нужна для выгрузки скрипта с графика, т.к. весь скрипт пришлось зациклить, чтобы он не удалялся с графика после одного прохода (как все скрипты работают), но если выгружать его терминальными командами удаления, то терминал из-за зацикливания на некоторое время подвисает.
Там в начале кода (они же входные переменные, но их лучше настроить сразу в коде) переменные настроек кнопок (вида, размера и положения), которые подписаны. Параметр sleep задает задержку выполнения цикла скрипта, чтобы он не частил слишком. Я попробовал у себя - вроде работает.
 

Вложения

  • ScriptLocker.mq4
    16,3 КБ · Просмотры: 19
СПАСИБО.ПРИ СПАСИБО. Можно было оставить , что бы он удалялся с графика.потому, что.потом я хочу закрыть ордера перекрытием.ещё раз СПАСИБО.
 

vladradon

Программист
Можно было оставить , что бы он удалялся с графика.потому, что.потом я хочу закрыть ордера перекрытием.ещё раз СПАСИБО.
Не вопрос. Вот с автоудалением и одной кнопкой. Только в самом теле скрипта нет проверки на открытие локирующего ордера (из-за реквот может не открыться), поэтому в первом варианте скрипта можно сколько угодно раз нажимать кнопку старт, пока не откроется, а во втором придется заново закидывать его на график, что не удобно. Я добавил в скрипт 10 попыток открытия лока с паузой 1 секунда.
 

Вложения

  • ScriptLocker2.mq4
    15,5 КБ · Просмотры: 17
Последнее редактирование:

on220

Интересующийся
Всем привет?Помогите пожалуйста с функцией где при каждом открываемом ордере (по индюку у меня) увеличивался лот.Я тут нашел на 24 вроде странице,но там че то у меня ни че не срослось;может устарел вариант,не знаю.Подскажите как ?
 

vladradon

Программист
Всем привет?Помогите пожалуйста с функцией где при каждом открываемом ордере (по индюку у меня) увеличивался лот.Я тут нашел на 24 вроде странице,но там че то у меня ни че не срослось;может устарел вариант,не знаю.Подскажите как ?
А мы здесь все экстрасенсы и сразу в курсе где что и почем... Более внятно объясняйте какая функция, что выполняет, какой рез нужен в итоге, те же мат расчеты лота - краткое ТЗ нужно, чтобы что-то сделать для начала.
 

on220

Интересующийся
vladradon,
Добрый!
Сигнал лонг по машке (пересечение): вход лот 0.1 второй 0.2 третий 0.3 т.е на очередных (пересечениях бай).Есть же по пунктам допустим каждые 10.п идет наращивание,но мне бы чтоб по сигналам индикатора а не пунктов.Как только плюс.,начинал сначала.
 

on220

Интересующийся
vladradon,
Белые палки места входов в лонги с каждой новой с увеличеным лотом,красный уровень выход.касание и сново начинаем с 0.1.Надеюсь будет понятно..

l1y4pyOQQYyFz8mWpRyM0Q.png
 
Последнее редактирование модератором:

vladradon

Программист
Добрый!
Сигнал лонг по машке (пересечение): вход лот 0.1 второй 0.2 третий 0.3 т.е на очередных (пересечениях бай).Есть же по пунктам допустим каждые 10.п идет наращивание,но мне бы чтоб по сигналам индикатора а не пунктов.Как только плюс.,начинал сначала.
Приветствую! Вы описали не функцию, а функционал советника с множеством функций разного рода. Здесь помогают по коду, а не пишут на заказ полный код- для этого обращайтесь к кому-то лично или на форумы, где пишут сов бесплатно. Я не буду тратить на это время. Может кто-то из местных чем-то поможет. И еще есть форум по поиску сов на этом портале и подобного хлама, что Вам нужен, полно в инете - просто набрать в поисковике грамотно то, что ищете. Удачи.
 

on220

Интересующийся
vladradon,
Вот код(походу ваших рук дело)
//+------------------------------------------------------------------+
//| aaa.mq4 |
//| Copyright © 2007, MetaQuotes Software Corp. |
//| metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link "metaquotes.net"
extern double step=25;
extern int StepMode=0;
// Если StepMode = 0, то шаг между ордерами фиксированный и равен step
// Если StepMode = 1, то шаг постепенно увеличивается
extern double proffactor=10;
extern double mult=1.5;
extern double lotsbuy=0.01;
extern double lotssell=0.01;
extern double per_K=200;
extern double per_D=20;
extern double slow=20;
extern double zoneBUY=50;
extern double zoneSELL=50;
extern double Magicbuy=555;
extern double Magicsell=556;

double openpricebuy,openpricesell,lotsbuy2,lotssell2,lastlotbuy,lastlotsell,tpb,tps,cnt,smbuy,smsell,lotstep,
ticketbuy,ticketsell,maxLot,free,balance,lotsell,lotbuy,dig,sig_buy,sig_sell,ask,bid;
int OrdersTotalMagicbuy(int Magicbuy)
{
int j=0;
int r;
for (r=0;r<OrdersTotal();r++)
{
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES))
{
if (OrderMagicNumber()==Magicbuy) j++;
}
}
return(j);
}

int OrdersTotalMagicsell(int Magicsell)
{
int d=0;
int n;
for (n=0;n<OrdersTotal();n++)
{
if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES))
{
if (OrderMagicNumber()==Magicsell) d++;
}
}
return(d);
}
int orderclosebuy(int ticketbuy)
{
string symbol = Symbol();
int cnt;
for(cnt = OrdersTotal(); cnt >= 0; cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == symbol && OrderMagicNumber()==Magicbuy)
{
ticketbuy=OrderTicket();OrderSelect(ticketbuy, SELECT_BY_TICKET, MODE_TRADES);lotsbuy2=OrderLots() ;
double bid = MarketInfo(symbol,MODE_BID);
RefreshRates();
OrderClose(ticketbuy,lotsbuy2,bid,3,Magenta);
}
}
lotsbuy2=lotsbuy;return(0);
}
int orderclosesell(int ticketsell)
{
string symbol = Symbol();
int cnt;
for(cnt = OrdersTotal(); cnt >= 0; cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == symbol && OrderMagicNumber()==Magicsell)
{
ticketsell=OrderTicket();OrderSelect(ticketsell, SELECT_BY_TICKET, MODE_TRADES);lotssell2=OrderLots() ;
double ask = MarketInfo(symbol,MODE_ASK);
RefreshRates();
OrderClose(ticketsell,lotssell2,ask,3, Lime);
}
}
lotssell2=lotssell;return(0);
}
int start()
{
//----
double profitbuy=0;double profitsell=0;
string symbol = OrderSymbol();
double spread = MarketInfo(symbol,MODE_SPREAD);
double minLot = MarketInfo(symbol,MODE_MINLOT);
if (minLot==0.01){dig=2;maxLot=MarketInfo(symbol,MODE_MAXLOT);}
if (minLot==0.1){dig=1;maxLot=((AccountBalance()/2)/1000);}
if(OrdersTotalMagicbuy(Magicbuy)>0)
{
double smbuy;
for (cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber () == Magicbuy)
{
ticketbuy = OrderTicket();OrderSelect(ticketbuy,SELECT_BY_TICKET, MODE_TRADES);
smbuy = smbuy+OrderLots();openpricebuy = OrderOpenPrice();lastlotbuy = OrderLots();
}
}
{
if (smbuy+(NormalizeDouble((lastlotbuy*mult),dig))<maxLot)
{
if(StepMode==0)
{
if(Ask<=openpricebuy-step*Point)
{
lotsbuy2=lastlotbuy*mult;
RefreshRates();ticketbuy=OrderSend(Symbol(),OP_BUY,NormalizeDouble(lotsbuy2,dig),Ask,3,0,0,"MartingailExpert",Magicbuy,0,Blue);
}
}
if(StepMode==1)
{
if(Ask<=openpricebuy-(step+OrdersTotalMagicbuy(Magicbuy)+OrdersTotalMagicbuy(Magicbuy)-2)*Point)
{
lotsbuy2=lastlotbuy*mult;
RefreshRates();ticketbuy=OrderSend(Symbol(),OP_BUY,NormalizeDouble(lotsbuy2,dig),Ask,3,0,0,"MartingailExpert",Magicbuy,0,Blue);
}
}
}
}
}
if(OrdersTotalMagicsell(Magicsell)>0)
{
double smsell;
for (cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber () == Magicsell)
{
ticketsell = OrderTicket();OrderSelect(ticketsell,SELECT_BY_TICKET, MODE_TRADES);
smsell = smsell + OrderLots();openpricesell = OrderOpenPrice();lastlotsell = OrderLots();
}
}
{
if (smsell+(NormalizeDouble((lastlotsell*mult),dig))<maxLot)
{
if(StepMode==0)
{
if(Bid>=openpricesell+step*Point)
{
lotssell2=lastlotsell*mult;
RefreshRates();ticketsell=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lotssell2,dig),Bid,3,0,0,"MartingailExpert",Magicsell,0,Red);
}
}
if(StepMode==1)
{
if(Bid>=openpricesell+(step+OrdersTotalMagicsell(Magicsell)+OrdersTotalMagicsell(Magicsell)-2)*Point)
{
lotssell2=lastlotsell*mult;
RefreshRates();ticketsell=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lotssell2,dig),Bid,3,0,0,"MartingailExpert",Magicsell,0,Red);
}
}
}
}
}
if(OrdersTotalMagicbuy(Magicbuy)<1)
{
if(iStochastic(NULL,0,per_K,per_D,slow,MODE_LWMA,1,0,1)>iStochastic(NULL,0,per_K,per_D,slow,MODE_LWMA,1,1,1)
&& iStochastic(NULL,0,per_K,per_D,slow,MODE_LWMA,1,1,1)>zoneBUY)ticketbuy = OrderSend(Symbol(),OP_BUY,lotsbuy,Ask,3,0,0,"MartingailExpert",Magicbuy,0,Blue);
}
if(OrdersTotalMagicsell(Magicsell)<1)
{
if(iStochastic(NULL,0,per_K,per_D,slow,MODE_LWMA,1,0,1)<iStochastic(NULL,0,per_K,per_D,slow,MODE_LWMA,1,1,1)
&& iStochastic(NULL,0,per_K,per_D,slow,MODE_LWMA,1,1,1)<zoneSELL)ticketsell = OrderSend(Symbol(),OP_SELL,lotssell,Bid,3,0,0,"MartingailExpert",Magicsell,0,Red);
}
for (cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderMagicNumber () == Magicbuy)
{
ticketbuy = OrderTicket();OrderSelect(ticketbuy,SELECT_BY_TICKET, MODE_TRADES);profitbuy = profitbuy+OrderProfit() ;
openpricebuy = OrderOpenPrice();
}
}
tpb = (OrdersTotalMagicbuy(Magicbuy)*proffactor*Point)+openpricebuy;
double bid = MarketInfo(Symbol(),MODE_BID);
if (profitbuy>0)
{
if (Bid>=tpb) orderclosebuy(ticketbuy);
}
for (cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magicsell)
{
ticketsell = OrderTicket();OrderSelect(ticketsell,SELECT_BY_TICKET, MODE_TRADES);profitsell = profitsell+OrderProfit();
openpricesell = OrderOpenPrice();
}
}
tps = openpricesell-(OrdersTotalMagicsell(Magicsell)*proffactor*Point);
double ask = MarketInfo(Symbol(),MODE_ASK);
if (profitsell>0)
{
if (Ask<=tps)orderclosesell(ticketsell);
}
free = AccountFreeMargin();balance = AccountBalance();
for (cnt=0;cnt< OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderMagicNumber () == Magicbuy) ticketbuy = OrderTicket();
if (OrderSymbol()==Symbol() && OrderMagicNumber () == Magicsell) ticketsell = OrderTicket();
}
if (OrdersTotalMagicbuy(Magicbuy)==0)
{
profitbuy=0;ticketbuy=0;tpb=0;
}
if (OrdersTotalMagicsell(Magicsell)==0)
{
profitsell=0;ticketsell=0;tps=0;
}
Comment("FreeMargin = ",NormalizeDouble(free,0)," Balance = ",NormalizeDouble(balance,0)," maxLot = ",NormalizeDouble(maxLot,dig),"\n",
"Totalbuy = ",OrdersTotalMagicbuy(Magicbuy)," Lot = ",smbuy," Totalsell = ",OrdersTotalMagicsell(Magicsell)," Lot = ",smsell,"\n",
"---------------------------------------------------------------","\n","Profitbuy = ",profitbuy,"\n",
"Profitsell = ",profitsell);
//----
for(int ii=0; ii<2; ii+=2)
{
ObjectDelete("rect"+ii);
ObjectCreate("rect"+ii,OBJ_HLINE, 0, 0,tps);
ObjectSet("rect"+ii, OBJPROP_COLOR, Red);
ObjectSet("rect"+ii, OBJPROP_WIDTH, 1);
ObjectSet("rect"+ii, OBJPROP_RAY, False);
}
for(int rr=0; rr<2; rr+=2)
{
ObjectDelete("rect1"+rr);
ObjectCreate("rect1"+rr,OBJ_HLINE, 0, 0,tpb);
ObjectSet("rect1"+rr, OBJPROP_COLOR, Blue);
ObjectSet("rect1"+rr, OBJPROP_WIDTH, 1);
ObjectSet("rect1"+rr, OBJPROP_RAY, False);
}
return(0);
}
//+------------------------------------------------------------------+
 
Последнее редактирование модератором:

eevviill2

Местный знаток
Всем привет?Помогите пожалуйста с функцией где при каждом открываемом ордере (по индюку у меня) увеличивался лот.Я тут нашел на 24 вроде странице,но там че то у меня ни че не срослось;может устарел вариант,не знаю.Подскажите как ?

PHP:
extern double start_lots = 0.01;
...
double Lots=start_lots*(OrdersTotal()+1);
OrderSend(...,Lots,...);
 
Верх