Нужна помощь в кодировании

 

Привет

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

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

Я уверен, что мой код действительно ужасен.

Я бы хотел, чтобы советник работал следующим образом:

Мой пользовательский индикатор ELine имеет две линии, которые движутся пошагово. Иногда одна из них выше другой, иногда они одинаковы.

Когда одна линия пересекает другую, я бы хотел, чтобы советник входил в длинную или короткую позицию, в зависимости от того, какая линия пересекается вверх.

Всегда есть открытая позиция, за исключением запуска советника.

Когда я пытаюсь скомпилировать его, он говорит "if" - ожидается точка с запятой (20,7).

Тогда на следующем шаге он должен всегда закрывать уже существующую позицию, когда открывает новую, но пока я не смог это закодировать.

Не мог бы кто-нибудь исправить ошибки в моем коде и, возможно, подсказать мне, как я могу закрывать позиции каждый раз, когда советник открывает новую?

Большое спасибо!

Файлы:
el1.mq4  2 kb
 

Привет

Теперь я решил эту проблему. Я смог скомпилировать советника и попытался протестировать его. Но, к сожалению, он ничего не покупает и не продает!

Кроме этого он вроде бы работает, вот журнал:

14:16:18 EL1 inputs: Lots=0.1; Timeframe=240;

14:16:18 ELine GBPUSD,H4: удален

14:16:18 2005.11.14 00:00 ELine GBPUSD,H4: успешно загружен

А это код советника:

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

//| T1.mq4

//|

//|

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

extern double Lots = 0.1;

extern int Timeframe = 240;

string strDirCurrent="none";

string strDirPrevious="none";

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

//| |

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

int start()

{

// проверка текущего направления

if(iCustom(NULL,Timeframe, "ELine",0,0)>iCustom(NULL,Timeframe, "ELine",1,0))

strDirCurrent="long";

if(iCustom(NULL,Timeframe, "ELine",0,0)<iCustom(NULL,Timeframe, "ELine",1,0))

strDirCurrent="short";

// сравниваем с предыдущим направлением и открываем позицию, если произошло изменение

if(strDirCurrent=="long" && strDirPrevious=="short")

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,50,200, "EABuyOrder",16384,0,Green);

if(strDirCurrent=="short" && strDirPrevious=="long")

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,50,200, "EASellOrder",16384,0,Red);

strDirPrevious=strDirCurrent;

}

// конец.

Любая помощь очень приветствуется!!!

Спасибо

Эрик

 

Привет,

когда я заменяю NUL L на NULL, я не получаю никаких ошибок при копировании.

 

если вы посмотрите в курсе разработки на этом форуме, вы найдете "My_First_EA", кодинд с пересекающимися МА.

Я не смог получить никаких результатов, тестируя ваш советник, и я тоже очень новичок в EA-Proramming. Извините

 

Спасибо, balue. Пробел в NULL - это только от копирования и вставки, в моем коде он написан правильно. И он действительно компилируется (вторая версия).

Я знаю курс MQL (хотя я еще не прошел его до конца).

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

 

Пожалуйста, прикрепите ваш индикатор - чтобы мы могли провести бэктестинг

Привет

Отличный код - я бы с удовольствием провел бэктест - пожалуйста, предоставьте нам ваш icustom Eline.

Я сильно модифицировал ваш код.

/*

* Created by SharpDevelop.

* User: CARDIO

* Date: 1/17/2006

* Time: 4:55 AM

*

*Todo: if there is an ope position - close it- then open in opposite direction.

*

*/

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

//| T1.mq4

//|

//|

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

#include

extern double Lots = 0.1;

extern int Timeframe = 240;

string strDirCurrent="none";

string strDirPrevious="none";

int cnt, magicEA;

bool isclosing = false;

double slippage = 3;

int init() {

return(0);

}

int deinit() {

return(0);

}

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

//| |

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

int start()

{

magicEA = 16384;

// check for current direction

if(iCustom(NULL,Timeframe,"ELine",0,0)>iCustom(NULL,Timeframe,"ELine",1,0))

{

strDirCurrent="long";

}

if(iCustom(NULL,Timeframe,"ELine",0,0)<iCustom(NULL,Timeframe,"ELine",1,0))

{strDirCurrent="short";

}

// compare to previous direction and open a position if there was a change

if(strDirCurrent=="long" && strDirPrevious=="short")

{

//firs close open positions

isclosing = true;

isclosing1();

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,"T1_EA_Buy_Order",16384,0,Green);

return(0);

}

if(strDirCurrent=="short" && strDirPrevious=="long")

{

isclosing = true;

isclosing1();

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,"T1_EA_Sell_Order",16384,0,Red);

return(0);

}

strDirPrevious=strDirCurrent;

return(0);

}

// the end.

void isclosing1(){

//Close all open orders

//todo: get a requote on the prices if error 138 occurs, use refreshrates

//todo: check if the last 3 closes where losers - if so stop the ea

int totalOrders = OrdersTotal();

int numPos = 0;

for(cnt=0; cnt<totalOrders; cnt++) { // scan all orders and positions...

OrderSelect(cnt, SELECT_BY_POS); // the next line will check for ONLY market trades, not entry orders

if(OrderSymbol() == Symbol() && OrderType() <= OP_SELL && OrderMagicNumber() == magicEA) { // only look for this symbol, and only orders from this EA

numPos++;

if(OrderType() == OP_BUY) { // Check for close signal for bought trade

if(isclosing) {

if (OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Violet)) { // Close bought trade

//writetofile("10","Closed buy", OrderTicket());

//prtAlert("Day Trading: Closing BUY order");

} else {

// writetofile("10b","Closed buy fail", ErrorDescription(GetLastError()));

}

}

} else { // Check sold trade for close signal

if(isclosing) {

OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Violet);

//writetofile("10","Closed buy", OrderTicket());

// prtAlert("Day Trading: Closing SELL order");

}else {

//writetofile("10c","Closed sell fail", ErrorDescription(GetLastError()));

}

}

}

}

}

 

Исправлено, я надеюсь

Исправлены хлопоты. Попробуйте это

Нам еще предстоит поработать над управлением деньгами и т.д.

Файлы:
el1.mq4  4 kb
 

Спасибо, теперь я получаю следующее:

2006.01.17 18:59:10 2006.01.12 08:20 EL1: invalid double number as parameter 7 for OrderSend function

2006.01.17 18:59:10 2006.01.12 08:10 EL1: комментарий для функции OrderSend должен быть строкой

2006.01.17 18:59:09 EL1: загружено успешно

и ошибка повторяется около миллиона раз ;-)

но я думаю, что эту ошибку легко исправить.

 

Попробуйте это

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

Файлы:
el1_1.mq4  5 kb
 

все еще пытаюсь исправить - просто подождите я сейчас напишу

Все еще исправляю

 

Исправлено - надеюсь

На самом деле вам просто не хватало значения тейк-профита (tp).

Разве вам не нужны tp и stoploss?

Удачи

Файлы:
el1_2.mq4  5 kb