Как кодировать? - страница 151

 
luxinterior:
Используйте включаемый файл OrderReliable. Lux

кажется, немного не хватает для функции OrderSendReliable, есть ли у вас более поздняя версия?

 

Как использовать время в расчетах

Я новичок в MQL4 и просто пытался понять, смогу ли я сделать простой советник, который будет использовать некоторые базовые функции. Я хорошо знаю C++, но, наверное, плохо знаю MQL4, потому что что-то не так с этим кодом, и я думаю, что это связано с функциями времени или, возможно, с функциями покупки/продажи, вот код: ...и, кстати, это не было разработано для зарабатывания денег, просто тестирование функций Спасибо!

int start()

{

//----

double currenttimeN, currentvalue;

double timeM = TimeMinute(TimeCurrent());

double timeH = TimeHour(TimeCurrent());

currenttimeN = (timeH / 24) + (timeM / 1440);//даёт время суток в процентах или 1 (1 = один полный день), поэтому всегда меньше 1

currentvalue = Ask;

if (currentvalue > currenttimeN){

OrderSend(Symbol(),OP_SELL,1,Ask,3,Ask-25*Point,Ask+25*Point, "My order #2",16384,0,Green);

}

/* КОМАНДА НА ПОКУПКУ */

else if (currentvalue < currenttimeN){

OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point, "Мой ордер #2",16384,0,Green);

}

//----

return(0);

}

 

...................

 

Неправильная струна:

currenttimeN = (timeH / 24) + (timeM / 1440);//gives the time of day as a percent or 1 (1 = one complete day) so always less than 1[/CODE]

could be:

[CODE]currenttimeN = (timeH *60 + timeM) / 1440;

Как можно сравнить часть дня и цену?

 

покупать и продавать одновременно

может ли кто-нибудь помочь запрограммировать так, чтобы я мог покупать и продавать одновременно...какие-нибудь скрипты или т.д....

буду благодарен...

пример:

if (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green);

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, Red);

}

проблема в том, что он будет только покупать... но мне нужно, чтобы он выполнял оба ордера... спасибо...

 
kk81:
может ли кто-нибудь помочь запрограммировать так, чтобы я мог покупать и продавать одновременно...какие-нибудь скрипты или т.д....

я ценю это...

пример:

if (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green);

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, Red);

}

проблема в том, что он будет только покупать... но мне нужно, чтобы он выполнил оба ордера... спасибо.

https://www.mql5.com/en/forum/177583/page37

 

как получить цену возврата OrderClose?

Я хочу знать, по какой цене был закрыт ордер.

Файлы:
closeorder.jpg  62 kb
 

Бар свободы Форекс

привет

большое спасибо всем друзьям, конкретный Roger09

Мне нужен эксперт (автоматическая торговля) ForexFreedomBars .

когда квадрат 5m, 15m, 30m, 1H красный, отправлять ордер SELL на 10-20 TP

когда квадрат 5m, 15m, 30m, 1H становится синим, отправляем ордер BUY на 10-20 TP

(TP, SL, лот, maxtrade) способность должна измениться.

пожалуйста, помогите мне .

//+------------------------------------------------------------------+

//| #The Forex Freedom Bars

//|

//+------------------------------------------------------------------+

#property copyright "Programmed by Eli hayun"

#property indicator_separate_window

#property indicator_minimum -0.5

//#property indicator_maximum 5

#property indicator_buffers 8

#property indicator_color1 Red

#property indicator_color2 DodgerBlue

#property indicator_color3 Red

#property indicator_color4 DodgerBlue

#property indicator_color5 Red

#property indicator_color6 DodgerBlue

#property indicator_color7 Red

#property indicator_color8 DodgerBlue

//---- буферы

double buf4_up[];

double buf4_down[];

double buf3_up[];

double buf3_down[];

double buf2_up[];

double buf2_down[];

double buf1_up[];

double buf1_down[];

extern double Gap = 1; // Промежуток между линиями баров

extern int Period_1 = PERIOD_M5;//M15

extern int Period_2 = PERIOD_M15;//M30

extern int Period_3 = PERIOD_M30;//H1

extern int Period_4 = PERIOD_H1;//H4

extern int cci_1 = 2;//50

extern int cci_2 = 2;//14

extern int cci_3 = 2;

extern int cci_4 = 2;

extern int StopLoss=100;

extern int TakeProfit=100;

extern double Lots=0.1;

extern bool AutoDisplay = false;

string shortname = "";

bool firstTime = true;

int UniqueNum = 228;

//+------------------------------------------------------------------+

//| Пользовательская функция инициализации индикатора |

//+------------------------------------------------------------------+

int init()

{

SetAutoDisplay();

shortname = "# Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")";

firstTime = true;

IndicatorShortName(shortname);

//---- индикаторы

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,110);

SetIndexBuffer(0,buf4_up);

SetIndexEmptyValue(0,0.0);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,110);

SetIndexBuffer(1,buf4_down);

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW);

SetIndexArrow(2,110);

SetIndexBuffer(2,buf3_up);

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW);

SetIndexArrow(3,110);

SetIndexBuffer(3,buf3_down);

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW);

SetIndexArrow(4,110);

SetIndexBuffer(4,buf2_up);

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW);

SetIndexArrow(5,110);

SetIndexBuffer(5,buf2_down);

SetIndexEmptyValue(5,0.0);

SetIndexStyle(6,DRAW_ARROW);

SetIndexArrow(6,110);

SetIndexBuffer(6,buf1_up);

SetIndexEmptyValue(6,0.0);

SetIndexStyle(7,DRAW_ARROW);

SetIndexArrow(7,110);

SetIndexBuffer(7,buf1_down);

SetIndexEmptyValue(7,0.0);

//----

return(0);

}

//+------------------------------------------------------------------+

//| Пользовательская функция деинициализации индикатора |

//+------------------------------------------------------------------+

int deinit()

{

//----

SetAutoDisplay();

shortname = "# Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")";

firstTime = true;

//----

return(0);

}

//+------------------------------------------------------------------+

//| Пользовательская функция итерации индикатора |

//+------------------------------------------------------------------+

int start()

{

int counted_bars=IndicatorCounted();

int i=0, y5m=0, y1h=0, y30m=0, y15m=0, yy;

int limit=Bars-counted_bars;

datetime TimeArray_1H[], TimeArray_30M[], TimeArray_15M[], TimeArray_5M[];

//----

if (firstTime || NewBar())

{

firstTime = false;

int win = UniqueNum; // WindowFind(shortname);

double dif = Time[0] - Time[1];

for (int ii=ObjectsTotal()-1; ii>-1; ii--)

{

if (StringFind(ObjectName(ii), "FF_"+win+"_") >= 0)

ObjectDelete(ObjectName(ii));

else

ii=-1;

}

double shift = 0.2;

for (ii=0; ii<4; ii++)

{

string txt = "??";

double gp;

switch (ii)

{

case 0: txt = tf2txt(Period_1); gp = 1 + shift; break;

case 1: txt = tf2txt(Period_2); gp = 1 + Gap + shift; break;

case 2: txt = tf2txt(Period_3); gp = 1 + Gap*2 + shift; break;

case 3: txt = tf2txt(Period_4); gp = 1 + Gap*3 + shift; break;

}

string name = "FF_"+win+"_"+ii+"_"+txt;

ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp);

ObjectSetText(name, txt,8, "Arial", Silver);

}

}

ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_4);

ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3);

ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_2);

ArrayCopySeries(TimeArray_5M,MODE_TIME,Symbol(),Period_1);

for(i=0, y5m=0, y1h=0, y30m=0, y15m=0;i<limit;i++)

{

if (Time<TimeArray_5M[y5m]) y5m++;

if (Time<TimeArray_1H[y1h]) y1h++;

if (Time<TimeArray_30M[y30m]) y30m++;

if (Time<TimeArray_15M[y15m]) y15m++;

int cci_n = cci_1;

for (int tf = 0; tf < 4; tf++)

{

int prd;

switch (tf)

{

case 0: prd = Period_1; cci_n = cci_1; yy = y5m; break;

case 1: prd = Period_2; cci_n = cci_2; yy = y15m; break;

case 2: prd = Period_3; cci_n = cci_3; yy = y30m; break;

case 3: prd = Period_4; cci_n = cci_4; yy = y1h; break;

}

double cci = iCCI(NULL, prd, cci_n, PRICE_TYPICAL, yy);

double dUp = EMPTY_VALUE; // iCustom(NULL, prd, "SuperTrend", false, 1, yy);

double dDn = EMPTY_VALUE; //iCustom(NULL, prd, "SuperTrend", false, 0, yy);

если (cci < 0) dUp = 1; иначе dDn = 1;

switch (tf)

{

case 0: if (dUp == EMPTY_VALUE) buf1_down = 1; else buf1_up = 1; break;

case 1: if (dUp == EMPTY_VALUE) buf2_down = 1 + Gap * 1; else buf2_up = 1 + Gap * 1; break;

case 2: if (dUp == EMPTY_VALUE) buf3_down = 1 + Gap * 2; else buf3_up = 1 + Gap * 2; break;

case 3: if (dUp == EMPTY_VALUE) buf4_down = 1 + Gap * 3; else buf4_up = 1 + Gap * 3; break;

}

if (NewBar())

{

string sDir = "";

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

sDir = "Вверх";

if (buf1_down[0] + buf2_down[0] + buf3_down[0] + buf4_down[0] == 4)

sDir = "Down";

if (sDir != "")

{

PlaySound("alert1.wav");

Print("Forex freeway - Направление ",sDir);

}

}

}

}

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss ,TakeProfit); else

return(0);

}

//+------------------------------------------------------------------+

string tf2txt(int tf)

{

if (tf == PERIOD_M1) return("M1");

if (tf == PERIOD_M5) return("M5");

if (tf == PERIOD_M15) return("M15");

если (tf == PERIOD_M30) return("M30");

если (tf == PERIOD_H1) return("H1");

если (tf == PERIOD_H4) return("H4");

если (tf == PERIOD_D1) return("D1");

если (tf == PERIOD_W1) return("W1");

if (tf == PERIOD_MN1) return("MN1");

return("??");

}

void SetValues(int p1, int p2, int p3, int p4)

{

Period_1 = p1; Period_2 = p2; Period_3 = p3; Period_4 = p4;

}

void SetAutoDisplay()

{

if (AutoDisplay)

{

switch (Period())

{

case PERIOD_M1 : SetValues(PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_M30); break;

case PERIOD_M5 : SetValues(PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1); break;

case PERIOD_M15 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); break;

case PERIOD_M30 : SetValues(PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1); break;

case PERIOD_H1 : SetValues(PERIOD_M15, PERIOD_M30, PERIOD_H1, PERIOD_H4); break;

case PERIOD_H4 : SetValues(PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1); break;

case PERIOD_D1 : SetValues(PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1); break;

case PERIOD_W1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break;

case PERIOD_MN1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break;

}

}

}

bool NewBar()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Time[0];

return (true);

}

return(false);

}

 

Проблема переноса индикатора в советник в качестве функции фильтра

При попытке использовать часть индикатора в качестве функции в советнике я понял, что существует три типа функций. Первый тип - это Void, который выполняет процесс и возвращает 0. Второй тип выполняет вычисления и возвращает один результат. Третий тип ожидает, что ему будет дан набор определенных значений для обработки, и возвращает один результат.

Что делать, если мои вычисления дают три результата, которые нужно использовать как минимум двумя разными способами? Эти вычисления могут потребоваться в функции Start() по следующей причине: информация поступает из внешних переменных (которые могут быть настроены вручную) и глобальных переменных (которые остаются статичными, если не перекомпилированы) в различные функции советника. Функция Start() является мозгом эксперта и обращается к другим функциям за информацией. Она может передавать функции набор переменных в качестве аргументов этой функции, если функция объявила эти переменные в скобках (). Затем она получает результат и может передать еще переменные другой функции, чтобы завершить свой процесс.

Как только я научился передавать переменные в качестве аргументов другим функциям, я надеялся достичь успеха в кодировании советника. К сожалению, я создал ошибку нулевого деления, возможно, потому, что я пытался передать значение в качестве аргумента от одной функции к другой, так что значение не пришло в нужное место. Поскольку на самом деле оно отсутствовало, я получил ошибку деления на ноль. Моя следующая ревизия удалила промежуточные шаги и передавала значения непосредственно в функции, где они использовались.

(Я не думаю, что делаю себе одолжение, записывая этот момент из моего первого двухмесячного опыта изучения кодирования на MQL4. Тем не менее, всем, кто набирает в гугле "MQL4 zero divide error", будет полезно узнать, как мне удалось решить эту проблему).

Моя следующая ревизия советника вылечила ошибку деления на ноль, но комментарий в журнале моего стратагемного тестера теперь указывал на выход за пределы стека. Для тех, кто гуглит "MQL4 stack overrun", я опубликую причину, которую я нашел. Это была ошибка при переводе лотов в десятичный эквивалент с помощью константы "Points" при изменении цены для открытия или модификации ордера.

Последний совет, который я хотел бы здесь опубликовать (после моего первоначального двухмесячного опыта кодирования и более 12 переписываний советника) - это способ, с помощью которого я смог решить трудно находимую проблему "неравных левых парантезов". Редактор MetaEditor не выделяет текст скобки цветом. Если у вас есть продукт AutoDesk с Visual LISP Editor, вы можете открыть ваш MQ4-файл в этом редакторе и увидеть почти все пары скобок в цвете. Это значительно облегчает проверку на наличие пропущенной скобки.

Спасибо всем, кто делится своими ответами на этом форуме,

Счастливого кодинга!

 

Есть ли какая-нибудь помощь?

Также хотелось бы узнать, можно ли запускать ордера Metatrader из командной строки. И вообще, возможно ли взаимодействие внешних приложений с Metatrader с помощью какого-то API.

Спасибо

Джефф

Причина обращения: