Помощь в кодировании - страница 238

 

Есть ли возможность добавить опции для выбора?

Например,

Отдельно, покупка и продажа отдельно

Модификация: BE все купить 0, или +1, или +2 пипса или продать все BE 0, 1 или 2 пипса?

Возможно ли это?

be.mq4

Файлы:
be.mq4  1 kb
 

Здравствуйте, Младен,

Может ли кто-нибудь, пожалуйста, сказать мне, что я делаю неправильно, я в основном пишу свою ea, используя FX Gen с фрагментами и кодами, используя примеры из mq4 compiler и онлайн-форумов.Я пытаюсь закодировать свою стратегию для более легкой торговли, я смог выбрать последний ордер успешно, используя этот код.

void OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // Ни один ордер не открыт.

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder();

}

}

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

return(lastTicket);

}

else

Print("Ошибка OrderSelect() - ", ErrorDescription(GetLastError()));

}

Не могли бы вы взглянуть на этот код. Я пытаюсь удалить самый старый ордер сначала, используя время даты и билет ордера, например, если открытый ордер >2, удалите самый старый ордер.

//-------------------------------------------------------------

// Etasoft Inc. Forex EA и Script Generator версия 4.1 EA

//-------------------------------------------------------------

// Ключевые слова: MT4, Forex EA builder, создать советника, разработчик советников

#property copyright "Copyright © 2011, Etasoft Inc. Forex EA Generator v4.1"

#property link

#include

#include

// экспортируемые переменные

extern int OrderId = 1;

extern int Slippage = 2;

extern double Lots = 0.01;

extern int MaxOrdersAllowed = 2; // разрешены оп покупки и оп продажи

extern int Grid = 10; // общее расстояние в пунктах до открытых ордеров

extern string EAComment = "564 testing";

// локальные переменные

double PipValue = 1; // эта переменная здесь для поддержки 5-значных брокеров

bool Terminated = false;

string LF = "\n"; // используйте это в пользовательских или утилитарных блоках, где вам нужны переводы строк

int NDigits = 4; // используется в основном для NormalizeDouble в блоках типа Flex

int ObjCount = 0; // подсчет всех объектов, созданных на графике, позволяет создавать объекты с уникальными именами

int current = 0;

int init()

{

NDigits = Digits;

if (false) ObjectsDeleteAll(); // очистить график

Comment(""); // очистить график

}

// начало работы эксперта

int start()

{

if (Bars < 10)

{

Комментарий("Недостаточно баров");

return (0);

}

if (Terminated == true)

{

Комментарий("Советник прекратил работу.");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

if (true == false && false) PipValue = 10;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;

IfOrderDoesNotExist2();

IfOrderDoesNotExist4();

MaximumOrder();

}

void IfOrderDoesNotExist2()

{

bool exists = false;

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

exists = true;

}

}

else

{

Print("Ошибка OrderSelect() - ", ErrorDescription(GetLastError()));

}

if (exists == false)

{

BuyPendingOrder();

}

}

void IfOrderDoesNotExist4()

{

bool exists = false;

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

exists = true;

}

}

else

{

Print("Ошибка OrderSelect() - ", ErrorDescription(GetLastError()));

}

if (exists == false)

{

SellPendingOrder();

}

}

void BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point;

double SL = price - 0*PipValue*Point;

если (0 == 0) SL = 0;

double TP = price + 0*PipValue*Point;

если (0 == 0) TP = 0;

если (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue);

if (ticket == -1)

{

Print("Ошибка OrderSend() - ", ErrorDescription(GetLastError()));

}

}

void SellPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point;

double SL = price + 0*PipValue*Point;

если (0 == 0) SL = 0;

double TP = price - 0*PipValue*Point;

если (0 == 0) TP = 0;

если (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red);

if (ticket == -1)

{

Print("Ошибка OrderSend() - ", ErrorDescription(GetLastError()));

}

}

void MaximumOrder()

{

if (MaxOrdersAllowed> 0)

{

OrderCount();

}

}

void OrderCount()

{

int count = 0;

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol())

if (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

count++;

}

}

else

{

Print("Ошибка OrderSend() - ", ErrorDescription(GetLastError()));

}

if (count > MaxOrdersAllowed )

{

DeleteOldestOrder();

}

}

void DeleteOldestOrder()

{

datetime lastTime = 0;

int lastTicket = -1; // Ни одного открытого.

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}

}

}

return(lastTicket);

}

else

Print("Ошибка OrderSelect() - ", ErrorDescription(GetLastError()));

}

int deinit()

{

if (false) ObjectsDeleteAll();

}

 
sulaimoney:
Здравствуйте Младен ,

Кто-нибудь может подсказать мне, что я делаю не так, я в основном пишу свою ea, используя FX Gen с фрагментами и кодами, используя примеры из mq4 compiler и онлайн-форумов. Я пытаюсь закодировать свою стратегию для более легкой торговли, я смог успешно выбрать последний ордер, используя этот код.

void OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // Ни один ордер не открыт.

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder();

}

}

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

return(lastTicket);

}

else

Print("Ошибка OrderSelect() - ", ErrorDescription(GetLastError()));

}

Не могли бы вы взглянуть на этот код. Я пытаюсь удалить самый старый заказ сначала, используя время даты и билет заказа, например, если открытый заказ >2, удалить самый старый заказ.

//-------------------------------------------------------------

// Etasoft Inc. Forex EA и Script Generator версия 4.1 EA

//-------------------------------------------------------------

// Ключевые слова: MT4, Forex EA builder, создать советника, разработчик советников

#property copyright "Copyright © 2011, Etasoft Inc. Forex EA Generator v4.1"

#property link

#include

#include

// экспортируемые переменные

extern int OrderId = 1;

extern int Slippage = 2;

extern double Lots = 0.01;

extern int MaxOrdersAllowed = 2; // разрешены оп покупки и оп продажи

extern int Grid = 10; // общее расстояние в пунктах до открытых ордеров

extern string EAComment = "564 testing";

// локальные переменные

double PipValue = 1; // эта переменная здесь для поддержки 5-значных брокеров

bool Terminated = false;

string LF = "\n"; // используйте это в пользовательских или утилитарных блоках, где вам нужны переводы строк

int NDigits = 4; // используется в основном для NormalizeDouble в блоках типа Flex

int ObjCount = 0; // подсчет всех объектов, созданных на графике, позволяет создавать объекты с уникальными именами

int current = 0;

int init()

{

NDigits = Digits;

if (false) ObjectsDeleteAll(); // очистить график

Comment(""); // очистить график

}

// начало работы эксперта

int start()

{

if (Bars < 10)

{

Комментарий("Недостаточно баров");

return (0);

}

if (Terminated == true)

{

Комментарий("Советник прекратил работу.");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

if (true == false && false) PipValue = 10;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;

IfOrderDoesNotExist2();

IfOrderDoesNotExist4();

MaximumOrder();

}

void IfOrderDoesNotExist2()

{

bool exists = false;

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

exists = true;

}

}

else

{

Print("Ошибка OrderSelect() - ", ErrorDescription(GetLastError()));

}

if (exists == false)

{

BuyPendingOrder();

}

}

void IfOrderDoesNotExist4()

{

bool exists = false;

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

exists = true;

}

}

else

{

Print("Ошибка OrderSelect() - ", ErrorDescription(GetLastError()));

}

if (exists == false)

{

SellPendingOrder();

}

}

void BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point;

double SL = price - 0*PipValue*Point;

если (0 == 0) SL = 0;

double TP = price + 0*PipValue*Point;

если (0 == 0) TP = 0;

если (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue);

if (ticket == -1)

{

Print("Ошибка OrderSend() - ", ErrorDescription(GetLastError()));

}

}

void SellPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point;

double SL = price + 0*PipValue*Point;

если (0 == 0) SL = 0;

double TP = price - 0*PipValue*Point;

если (0 == 0) TP = 0;

если (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red);

if (ticket == -1)

{

Print("Ошибка OrderSend() - ", ErrorDescription(GetLastError()));

}

}

void MaximumOrder()

{

if (MaxOrdersAllowed> 0)

{

OrderCount();

}

}

void OrderCount()

{

int count = 0;

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol())

if (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

count++;

}

}

else

{

Print("Ошибка OrderSend() - ", ErrorDescription(GetLastError()));

}

if (count > MaxOrdersAllowed )

{

DeleteOldestOrder();

}

}

void DeleteOldestOrder()

{

datetime lastTime = 0;

int lastTicket = -1; // Ни одного открытого.

for (int i=OrdersTotal()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}

}

}

return(lastTicket);

}

else

Print("Ошибка OrderSelect() - ", ErrorDescription(GetLastError()));

}

int deinit()

{

if (false) ObjectsDeleteAll();

}

Попробуйте использовать функцию, подобную этой:

void DeleteOldestOrder()

{

datetime lastTime = Time[0]+Period()*60;

int lastTicket = -1; // None open.

for (int i=OrdersTotal()-1; i >= 0; i--)

{

if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() <= lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

}

if (lastTicket>-1)

if (OrderSelect(lastTicket,SELECT_BY_TICKET,MODE_TRADES))

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}
 

Спасибо Младен

все работает безупречно, кстати, прошу прощения за то, что разместил такой длинный кусок кода на форуме. Я все еще привыкаю к интерфейсу. Спасибо.

 

Индикатор не обновляется автоматически.

У меня есть индикатор, который очень хорошо подходит для моей торговли.

К сожалению, он не обновляется сам по себе. Я должен всегда вручную обновлять его.

Есть ли способ решить эту проблему?

Было бы очень полезно!!!

Заранее спасибо.

P.S.: Прикрепляю все, что у меня есть.

Файлы:
 

Он хочет получать смс уведомления. Как выглядит код?

 
popej30:
Он хочет получить смс уведомление. Как выглядит код?

папаж30

Сделайте вот так :

SendNotification("сообщение-уведомление, которое вы хотите отправить");

 

А куда вы вставляете свой номер телефона? Мой номер 0039 555-23-45. Куда вводить ?

Пример:

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

for (li_96 = 0; li_96 <= limit; li_96++) {

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

for (li_96 = 0; li_96 <= limit; li_96++) {

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}
 
popej30:
А куда вы вставляете свой номер телефона? Мой номер 0039 555-23-45. Куда вводить ?

Пример:

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

for (li_96 = 0; li_96 <= limit; li_96++) {

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

for (li_96 = 0; li_96 <= limit; li_96++) {

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}

Вот хорошее объяснение, как вы можете это сделать :

 
Jim Clark:
Индикатор не обновляется автоматически.

Здесь у меня есть индикатор, который очень хорошо подходит для моей торговли.

К сожалению, он не обновляется сам по себе. Я должен всегда вручную обновлять его.

Есть ли способ решить эту проблему?

Было бы очень полезно!!!

Заранее спасибо.

P.S.: Прикрепляю все, что у меня есть.

Джим

Вместо того чтобы переписывать все заново, добавьте ограничение на расчет баров, а затем все эти бары пересчитываются. Это должно решить проблему обновления (просто держите BarsTocalculate на каком-то разумном - не слишком большом и не слишком маленьком значении. Я использовал 1000 по умолчанию, и, кажется, все в порядке). Попробуйте

Файлы:
Причина обращения: