Скачать MetaTrader 5

Составил советник печатающий значения Bid и Ask в txt но появились проблемы

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сотни статей помогут создать торгового робота. Заходи и изучай!
Forex Trader
114255
Forex Trader 2005.12.14 22:23 
Я попытался составить такой советник который бы сравнивал значения Бид сейчас и минуту назад (час, день, месяц) и значение Аск сейчас и минуту назад.
Если Бид(сейчас) - Бид(минуту назад) > Аск(сейчас) - Аск(минуту назад) записывал бы значение бид в BID.TXT Если Бид(сейчас) - Бид(минуту назад) < Аск(сейчас) - Аск(минуту назад) записывал бы значение Аск в ASK.TXT

Я попытался сделать такой советник но у меня не очень получилось так как у меня мало(практически нет) опыта в MQ4.
Вот что у меня вышло:

//+------------------------------------------------------------------+
//| Sovetnik.mq4|
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{

string Bids;
string Asks;
string Bidslast;
string Askslast;
string Bidssum;
string Askssum;
string askfile;
string bidfile;
string Bidssumpol;
string Askssumpol;


//----
Bids = OrderSend(Symbol(),MODE_BID,PERIOD_M1);
Asks = OrderSend(Symbol(),MODE_ASK,PERIOD_M1);
Bidssum = Bids - Bidslast
Askssum = Asks - Askslast

if (Bidssum < 0)
Bidssumpol = - Bidssum
if (Askssum < 0)
Askssumpol = - Askssum
If (Askssumpol > Bidssumpol)
{
If (Askssum > 0)

string file_name = askfile".txt";
int handle = FileOpen(file_name, FILE_WRITE, " ");

/////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////
string ListAsk = "Asks";

/////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////

FileWrite(handle,
"",
ListAsk);


FileClose(handle);
}
Bidslast = Bids;
Askslast = Asks;

If (Askssumpol < Bidssumpol)
{
If (Bidssum > 0)
string file_name1 = bidfile".txt";
int handle1 = FileOpen(file_name, FILE_WRITE, " ");

/////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////
string ListBid = "Bids";

/////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////

FileWrite(handle1,
"",
ListBid);
FileClose(handle1);
}
Bidslast = Bids;
Askslast = Asks;

If (Askssumpol = Bidssumpol)
Bidslast = Bids;
Askslast = Asks;

//----
return(0);
}
//+------------------------------------------------------------------+


Если это не затруднит помогите пожалуйста сделать его.
Еще я пытался сделать если значение bid или ask падает в течение 3 минут тоесть 3 раза (подряд то он не печатал бы эти файлы пока bid и ask не перестанет падать в течение 3 минут. Но это было уже выше моих сил.

В примере я пытался сделать его поминутным но мне надо для любых валют и в любой период времени.
Файлы должны быть одни и те же все время советник должен просто добавлять в них новые данные.
Forex Trader
114255
Forex Trader 2005.12.14 23:45  
Функция OrderSend() - это такая, кот. открывает ордер. Продаёт.. покупает.
К тому же у неё другой формат.
С помощью этой функции нельзя получить то, что Вы пытаетесь получить.

Чтобы что-то написать на MQL4 нужно открыть МетаЭдитор и прочесть Хелп по всем функциям, потом выбрать необходимые и применить в коде.

В МЕ(МетаЭдиторе) написано:
int OrderSend( string symbol, int cmd, double volume, double price, 
int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0,
datetime expiration=0, color arrow_color=CLR_NONE) 

Основная функция, используемая для открытия позиции или установки отложенного ордера


Приведенный отрывок текста начинается с int, это означает, что функция возвращает значение целого типа. Это такое: 1, 2, 73, 12 и пр. 3,5 - уже не годится, только целые, которые целые по своей сути. Например, невозможно подпрыгнуть полтора раза, только раз или два. Количество подпрыгиваний - целое число. В коде эксперта почему-то все переменные имеют строковый тип - string. То есть, такой тип переменных, которым полагается иметь своим значением буквосочетание, строку символов, например, "зелёный трамвай" или "С Новым Годом!".

Таким образом, то , что написано в эксперте, русскими словами можно прочитать так:
Переменной, предназначенной для поздравлений, присвоить целое значение в результате выполнения открытия ордера по ошибочно составленной функции, в надежде, что эта переменная будет содержать действительное значение Бид.
----------

Если Вы хотите писать программы на MQL4, то лучше начать внимательное изучение правил языка отсюда: "Синтаксис языка"

Forex Trader
114255
Forex Trader 2005.12.15 23:34  
SK спасибо. Я переделал все это и вот что у меня получилось:
//+------------------------------------------------------------------+
//| Sovetnik.mq4|
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
double init()
{

double Bids;
double Asks;
double Bidslast;
double Askslast;
double Bidssum;
double Askssum;
double askfile;
double bidfile;
double Bidssumpol;
double Askssumpol;

//--------------------------------------+
//Тут Askslast и Bidslast равны нулю а мне надо чтобы они присвоили значение курса валют минуту назад
//---------------------------------------+

Askslast = 0.00;
Bidslast = 0.00;

//-----------------------------------+
// Bids = MarketInfo("EURUSD",MODE_BID);
// Asks = MarketInfo("EURUSD",MODE_ASK);
// я не уверен в них они будут получать данные в какой период? Как его указать? И как сделать не для "EURUSD" а для любых валют?
//-----------------------------------+
Bids = MarketInfo("EURUSD",MODE_BID);
Asks = MarketInfo("EURUSD",MODE_ASK);
Bidssum = Bids - Bidslast;
Askssum = Asks - Askslast;
Bidssumpol = Bidssum;
Askssumpol = Askssum;

if (Bidssum < 0)
Bidssumpol = - Bidssum;
else
Bidssumpol = Bidssum;

if (Askssum < 0)
Askssumpol = - Askssum;
else
Askssumpol = Askssum;

//--------------------------------------------------------------------+
//If (Askssumpol > Bidssumpol) почему 'If' - function is not defined? Я же ее вроде определил?
//--------------------------------------------------------------------+
If (Askssumpol > Bidssumpol)
{
If (Askssum > 0);
string file_name = +askfile+".txt";
int handle = FileOpen(file_name, FILE_WRITE, " ");
double ListAsk = "Asks";
FileWrite(handle,
"",
ListAsk);
FileClose(handle);
Bidslast = Bids;
Askslast = Asks;
}
//---------------------------------------------------------------+
// 'Bidslast' - semicolon expected
// 'file_name1' - semicolon expected
//это я вообще не знаю что такое и как исправить
//---------------------------------------------------------------+
If (Askssumpol < Bidssumpol)
{
If (Bidssum > 0)
string file_name1 = +bidfile+".txt";
int handle1 = FileOpen(file_name, FILE_WRITE, " ");
double ListBid = "Bids";
FileWrite(handle1,
"",
ListBid);
FileClose(handle1);
Bidslast = Bids;
Askslast = Asks;
}

If (Askssumpol == Bidssumpol)
Bidslast = Bids;
Askslast = Asks;

return(0);
}
//+------------------------------------------------------------------+
//'If' - function is not defined
//'{' - semicolon expected
//'If' - function is not defined
//'If' - function is not defined
//'{' - semicolon expected
//'If' - function is not defined
//'file_name1' - semicolon expected
//'If' - function is not defined
//'Bidslast' - semicolon expected
// Это все ошибки
//-------------------------------------------------------------------+


Помогите пожалуйста их исправить.
Там даны комментария с вопросами которые мне не понятны
Forex Trader
114255
Forex Trader 2005.12.16 00:26  
Всё же, разумнее всего ещё почитать правила языка.
Начните с малого. Напишите самый короткий эксперт, но такой, в кот. Вы всё понимаете. Без полного понимания написанного не имеет смысла продвигаться дальше.

По Вашему коду.
1. double init() - это функция, кот. выполняется один раз в начале, при загрузке эксперта, в момент его подключения к графику. Всего один раз. Система проходит по строкам этой функции (обычно сверху вниз) до тех пор, пока не встретит опратор return().
После этого обычно система передаёт управление специальной функции start(). Эта функция работает от начала до конца проходя свои строки многократно, а запускает её на выполнение новый тик.
Ваш код весь написан в init(), функции start() нет совсем. Поэтому, всё, что Вы написли отработает один раз и всё..

2. Разберитесь с переводом ошибок. Если необходимо, возьмите словать и переведите, это не так трудно.
- оператор if пишется с маленькой буквы (и поэтому выделяется синим цветом) В Вашем коде If с больш. буквы воспринят компилятором как название инородной функции, которая не найдена компилятором.
'If' - function is not defined = функция не найдена.
- '{' - semicolon expected = скобка не сбалансирована (не найдена ответная скобка).

3. string file_name1 = +bidfile+".txt";
Будьте внимательны. Компилятор не прощает ошибок. Что значит буквосочетание +bidfile+? Если это переменная, то она не имеет права начинаться со знака "плюс", если что-то другое, то что?

Из всего этого можно ещё раз заключить, для написания экспертов у Вас пока недостаточно знаний.
Поэтому лучше всего установить последнюю версию МТ (билд 186 от 14.12.05, ссылка в соседней теме), открыть МЕ и подробно прочесть весь словарь в навигаторе.
Кроме того, здесь на сайте опубликован и подробно расписан пример советника. Очень полезно было бы его досконально изучить. Позднее можно копировать из него фрагменты.
Forex Trader
114255
Forex Trader 2005.12.17 17:58  
SK спасибо, пойду зубрить!
Forex Trader
114255
Forex Trader 2005.12.19 19:54  
привет всем!!!
у меня подобная проблема... :(
int start()
{
double k = Ask;
Print(k); // вывод в консоль
string d = "text.txt"; // вот здесь не хочет понимать что-то вроде "d://temp/programulina/text.txt"
int handle;
handle=FileOpen(d,FILE_BIN|FILE_WRITE); // а это вывод в файл
FileWrite(handle,k);
FileClose(handle);
return(0);
}
ну вроде проще некуда... да вот только в консоли я вижу отображение ASK с каждым тиком, а файл не меняется :(
зато в тестере стратегий все работает на ура! Да вот только торговать мне не в тестере нужно :( помогите плиз.....
Forex Trader
114255
Forex Trader 2005.12.20 22:54  
//+------------------------------------------------------------------+
//| Советник.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
//-------------------------------------------------------------------+
// |
//-------------------------------------------------------------------+
// Обьявил глобальные переменные

double Bidslast;
double Askslast;
double Bidslast1;
double Askslast1;
// Присвоил им невероятно высокие и низкие значения чтобы программа не пошла по ложным вычислениям
// пока не получит реальные значения прошлых курсов. (Это значение же будет
// только 1 раз при запуске советника так как я их дальше изменю или все время?
Bidslast = 0.1;
Askslast = 7777.7777;
Bidslast1 = 8888.8888;
Askslast1 = 0;
double start()
{
//----
// объявление переменных и подсчет в какой файл нужно записывать значения
double Bids;
double Asks;
double Bidssum;
double Askssum;
double Bidssumpol;
double Askssumpol;
double nenysna;
Bids = MarketInfo("EURUSD",MODE_BID);
Asks = MarketInfo("EURUSD",MODE_ASK);
// сравниваю нынешний курс и 2 предыдущих (чтобы не продавать дешево когда цена идет вверх у bid
// и покупать дорого когда цена идет вниз у ask).
if (Bids > Bidslast > Bidslast1 || Asks < Askslast < Askslast1)
// nenysna не нужна вообще но без нее компилятор выдает ошибку
nenysna = 1;
else
// сравниваю текущий и прошлый курс
{
Bidssum = Bids - Bidslast;
Askssum = Asks - Askslast;
// присваивание полученного результата переменной
//если получилось отрицательное Bidssum или Askssum то переделать в +
if (Bidssum < 0)
Bidssumpol = - Bidssum;
else
Bidssumpol = Bidssum;

if (Askssum < 0)
Askssumpol = - Askssum;
else
Askssumpol = Askssum;

// сравниваю Bidssumpol и Askssumpol
if (Askssumpol > Bidssumpol)
// проверка больше ли нуля получилось Askssum если да то запись
// ask в askfile.txt
{
if (Askssum > 0)
string file_name = "askfile.txt";
int handle = FileOpen(file_name, FILE_WRITE, " ");
double ListAsk = Asks;
FileWrite(handle,ListAsk);
FileClose(handle);
}
// сравниваю Bidssumpol и Askssumpol
if (Askssumpol < Bidssumpol)
// проверка больше ли нуля получилось Bidssum если да то запись
// bid в bidfile.txt
{
if (Bidssum > 0)
string file_name1 = "bidfile.txt";
int handle1 = FileOpen(file_name1, FILE_WRITE, " ");
double ListBid = Bids;
FileWrite(handle1,ListBid);
FileClose(handle1);
}
}
// присваиваю Bidslast, Askslast значения текущего курса а Bidslast1 и Askslast1
// значения прошлого курса для дальнейших вычислений
Bidslast1 = Bidslast;
Askslast1 = Askslast;
Bidslast = Bids;
Askslast = Asks;
//----
return(0);
}
//+------------------------------------------------------------------+
// |
//+------------------------------------------------------------------+


Может я плохо соображаю но что теперь не так? Metaeditor ошибок не выдает но при тестировании они появляются и не пишутся файлы? кто поможет?
Forex Trader
114255
Forex Trader 2005.12.21 11:11  
1. Повнимательней посмотри на if (Bids > Bidslast > Bidslast1 || Asks < Askslast < Askslast1). По-моему, это не коррекная запись. Я бы разделил выражения сравнения и использовал скобки.
2. nenysna = 1; Разберись почему. Что вообще происходит по этому условию.
3. Для отладки программы используй Аlert() (или Print), а в файл пока не пиши. Выдавай везде в сомнительных местах Алерт, чтоб знать и контролировать на этапе отладки текущие значения переменных.
4. До тех пор, пока Алерт не выдаст ожидаемое значение, в файл его не пиши, это успеется.
5. Не торопись. Напиши маленький, но точно работающий кусок. Академический подход даёт лучшие результаты (в отличие от всяких мозговых штурмов, революций и прорывов).
Forex Trader
114255
Forex Trader 2005.12.21 11:35  
По-моему, есть ещё ошибки
Что значит это?
if (Askssum > 0)
string file_name = "askfile.txt";
int handle = FileOpen(file_name, FILE_WRITE, " ");
double ListAsk = Asks;
FileWrite(handle,ListAsk);
FileClose(handle);


Наверное, имелось ввиду такое:

if (Askssum > 0)
   {
   string file_name = "askfile.txt";
   int handle = FileOpen(file_name, FILE_WRITE, " ");
   double ListAsk = Asks;
   FileWrite(handle,ListAsk);
   FileClose(handle);
   }
Forex Trader
114255
Forex Trader 2005.12.22 00:09  
доброго времени суток, это снова я...
в моей версии метатрейдера(4.0 build 186) если работаешь в режиме проверки стратегий, то файлик test.txt лежит в '...\FinMarket Trade Station 4\tester\files\text.txt'
а если в реальном времени, то '...\FinMarket Trade Station 4\experts\files\text.txt'
убедительная просьба к разработчикам, сделайте людские пути к файликам, чтоб недоразумений не возникало...

Спасибо за внимание.
MetaQuotes Software Corp.
Модератор
181083
MetaQuotes Software Corp. 2005.12.22 02:50  
в моей версии метатрейдера(4.0 build 186) если работаешь в режиме проверки стратегий, то файлик test.txt лежит в '...\FinMarket Trade Station 4\tester\files\text.txt'
а если в реальном времени, то '...\FinMarket Trade Station 4\experts\files\text.txt'

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