Спрашивайте! - страница 157

 

Попробуйте сделать что-то вроде этого:

string uniqueFileName()

{

string sname=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);

string tname="";

for (int i=0;i<StringLen(sname);i++)

{

string char = StringSubstr(sname,i,1);

if (char!="." && char!=":")

if (char==" ")

tname = tname+"_";

else tname = tname+char;

}

return(tname+"_"+Symbol()+Period()+".csv");

}[/php]this one adds hour, minute and seconds in the middle to make it more or less unique (so something like this "20090924_102541_EURUSD15.csv"). To make it really sure that the file does not exist it would have to be a bit more complicated (something like this :

[php]string uniqueFileName()

{

string sname=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);

string tname="";

int thand;

for (int i=0;i<StringLen(sname);i++)

{

string char = StringSubstr(sname,i,1);

if (char!="." && char!=":")

if (char==" ")

tname = tname+"_";

else tname = tname+char;

}

//

//

//

//

//

tname = tname+"_"+Symbol()+Period()+".csv";

thand = FileOpen(tname,FILE_BIN|FILE_READ);

if (thand==-1)

return(tname);

else

{

FileClose(thand);

return("failed to make unique name");

}

}

В случае неудачи он вернет строку"не удалось создать уникальное имя", и в этом случае вы должны решить, сколько раз вы хотите, чтобы он повторил попытку.

PS: использование будет таким: someFileName=uniqueFileName();

с уважением

mladen

tedalagi:
привет всем,

Я трейдер, но не знаю языка mq4 и пытаюсь сделать это со вторника...

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

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

string fname = [дата в формате YYYYMMDD] + "_"+[дата - только час]+"_" + Symbol() + Period() + ".csv";

Код, о котором идет речь, выделен жирным шрифтом.

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

20090924_10_GBPJPY15.csv

Извините, что не могу потратить много времени, чтобы прочитать 157 страниц этой огромной темы (я пытался, и у меня закружилась голова).

Заранее спасибо.
 
 
 
mladen:
Используйте это так (mql не позволяет вложенные функции или процедуры, поэтому функция или процедура должна быть отдельной)

Все работает отлично, спасибо большое.

mladen:

По поводу сохранения файлов в любом месте: да, это можно сделать с помощью windows API. Вот ссылка с хорошим примером и хорошим объяснением, как это сделать: Файловые операции через WinAPI - Статьи MQL4

Я буду изучать это, и обязательно вернусь в эту тему.

Да благословит вас Бог.

 

"Дублирующая запись": Почему моя программа не работает?

Извините: я разместил это раньше, но я не могу переместить сообщение на Форум.

(Он также не позволяет делать "закладки" из истории моего компьютера...)

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

Т.е.: при "росте", максимум на баре 1 выше, чем на баре 2, а минимум на баре 1

также выше, чем на баре 2. (Вниз - симметрично).

Программа работает с прорывами, поэтому на "вверх" максимум бара 1 минус минимум бара 2 должен быть выше некоторого порога.

бара 2 должны быть выше некоторого порога. ("Вниз" - симметричный.)

Сейчас работаю с M30 GBPUSD. Выбрал этот "порог прорыва" на глаз,

как и для TakeProfit. StopLoss - как указано в проге.

Итак: пытаюсь набраться опыта в MetaTrader & mql4.

Потом можно пробовать другие проги, оптимизировать и т.д.

Итак: дошел до компиляции проги и запуска на тестере стратегий.

Но, она никогда не доходит до второй половины проги, и не печатает, что она

что он ввел ордер.

Для кого-то опытного, возможно, моя ошибка очевидна.

Для меня же она не очевидна.

Так что: не могли бы вы помочь с этим?

Спасибо.

Прога работает следующим образом.

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

//| функция инициализации эксперта |

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

int init()

{

//----

//----

return(0);

}

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

//| функция деинициализации эксперта | |

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

int deinit()

{

//----

//----

return(0);

}

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

//| функция запуска эксперта |

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

int start()

{

//----

bool TrendUp1;double TakeProfitUp;double EE = .00500;

bool OrdTot_OK;double lot;double slip;

double SL_Trailing_Up;bool High2Up;bool Low2Up;

int ticketup;int ticketdown;bool DownAndBig; bool UpAndBig;

bool TrendDown; double SL_Trailing_Down;double TakeProfitDown;

bool High2down; bool Low2down;

int ABC = OrdersTotal();

double Size1 = .00630;bool BigUp; double A = High[1];double B= Low[2];

double C = High[2]; double D = Low[1];bool BigDown;

//------------------------------------ начало ордера

if (ABC == 0)// нет ордеров на выход - true

OrdTot_OK = true;

if (ABC == 0)// no orders out is true

Print ("при последовательности ордеров вниз, ни один ордер не вышел");

if ((C-D) > Size1)//высота из 2 меньше минимума из 1 > .0063

BigDown = true;

if ((C-D) > Size1)//high of 2 less low of 1 > .0063

Print ("на последовательности ордеров вниз, найден большой прорыв вниз");

if (High[1]< High[2])

High2down=true;

if (High[1]< High[2])

Print ("на последовательности ордеров вниз, последовательные бары имеют снижающиеся максимумы");

if(Low[1]< Low[2])

Low2down=true;

if(Low[1]< Low[2])

Print ("в последовательности ордеров вниз, последовательные бары имеют убывающие минимумы");

if (High2down && Low2down)

TrendDown=true;

if (High2down && Low2down)

Print ("в последовательности ордеров на понижение установлен флаг TrendDown");

if (TrendDown)

SL_Trailing_Down = High[1];

if (TrendDown)

Print ("в последовательности ордеров на понижение, установлен стоп_лосс");

if (TrendDown)

TakeProfitDown = Bid - (.005);

if (TrendDown)

Print ("в последовательности ордеров на понижение, получен тейкпрофит", TakeProfitDown);

if (TrendDown && BigDown)

DownAndBig = true;

if (DownAndBig && OrdTot_OK)

ticketdown = OrderSend(Symbol(),OP_SELL,lot,Bid,slip,SL_Trailing_Down,TakeProfitDown,Blue);

if (DownAndBig && OrdTot_OK)

Print ("на последовательности ордеров вниз, пытались ввести тикет", ticketdown);

if (ticketdown < 0)

Print("OrderSend_Down failed with error #",GetLastError());

return(0);

//----------------------------------------------down order done

//---------------------------------------------------up order start

if (ABC == 0)

OrdTot_OK = true;

if (ABC == 0)

Print ("на восходящей последовательности не было ни одного ордера");

if ((A - B) > Size1)

BigUp = true;

if ((A - B) > Size1)

Print ("на восходящей последовательности тест размера для двух баров прошел нормально");

if (High[1] > High[2])

High2Up = true;//44

if (High[1] > High[2])

Print ("на восходящей последовательности тест на повышение максимумов был в порядке");

if(Low[1] > Low[2])

Low2Up=true;

if(Low[1] > Low[2])

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

if (High2Up && Low2Up)

TrendUp1=true;

if (High2Up && Low2Up)

Print ("на восходящей последовательности был установлен флаг для восходящей последовательности");

if (TrendUp1)

SL_Trailing_Up = Low[1] ;

if (TrendUp1)

Print ("на восходящей последовательности установил стоплосс");

if (TrendUp1)

TakeProfitUp = Ask + (.005);

if (TrendUp1)

Print ("на восходящей последовательности установлен тейкпрофит", TakeProfitUp);

if (TrendUp1 && BigUp)

UpAndBig = true;

if ( UpAndBig && OrdTot_OK)

ticketup = OrderSend(Symbol(), OP_BUY,lot, Ask,slip, SL_Trailing_Up,TakeProfitUp,Red);

if (UpAndBig && OrdTot_OK)

Print ("на восходящей последовательности попытался отправить ордер", ticketup);

if (ticketup < 0)

Print("OrderSend_Up failed with error #",GetLastError());

return(0);

//-------------------------------------------------up order done

//----

return(0);//эта строка может быть лишней

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

//----

return(0);

}

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

 

Использование нескольких CharToStr????

Я хотел бы разместить два символа wingding. Один поверх другого. Вот код, который я использую для установки первого символа-----ObjectSetText("signal "+x+"0",CharToStr(104),symbolSize, "Wingdings",Yellow);.

Я хотел бы добавить (236) и использовать для него другой цвет.

Возможно ли это сделать? Если да, то помогите, пожалуйста.

Спасибо за внимание,

gever17

 

Sleep | IsTradeContextBusy

Приветствую CodeMasters и всех остальных!

У меня есть советник на основе фракталов, он используется на 1 платформе MT4, и на нескольких валютных парах, на таймфрейме D1.

Поскольку более одной копии советника торгуют в один и тот же момент, я получаю уведомление ''Trade Context Is Busy'' в моем журнале.

Я хотел бы вставить в советник функцию Sleep или IsTradeContextBusy, но не знаю, где ее разместить:

- после функции отправки ордера, отдельно для функции продажи и покупки?

- после функции отправки ордера на продажу и покупку?

- как решить эту проблему - с помощью

if (IsTradeContextBusy() == true) Sleep (5000); return;

???

Пожалуйста, подскажите или направьте меня к решению.

Большое спасибо за помощь,

Удачи,

Саймон

Советник прилагается.

Файлы:
 

Нужен совет!

Здравствуйте,

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

Спасибо.

 

Посоветуйте, пожалуйста

Привет, ребята, я действительно не знаю, как работает MagicNumber, потому что кажется, что он НЕ РАБОТАЕТ. Я сделал 2 простых советника, которые прилагаются, я все еще учусь.

1. Покупаем, когда цена выше 100SMA

2. Продавать, когда цена также выше 100SMA

Это значит, что когда вы прикрепляете их к двум разным графикам Eurusd, они должны покупать и продавать в одно и то же время. Теоретически, каждый советник работает самостоятельно.

Но это не так... Похоже, что если сначала идет продажа, то советник на покупку не работает, и наоборот.

Может ли кто-нибудь перекодировать мой советник, управляющий MagicNumber? Что-нибудь не так?

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

Файлы:
buy100ma.mq4  9 kb
sell100ma.mq4  9 kb
 
Ghosthand:
Привет, ребята, я действительно не знаю, как работает MagicNumber, потому что кажется, что он НЕ РАБОТАЕТ. Я сделал 2 простых советника, которые прилагаются, я все еще учусь.

1. Покупайте, когда цена выше 100SMA

2. Продавать, когда цена также выше 100SMA

Это означает, что когда вы прикрепляете их к двум разным графикам Eurusd, они должны покупать и продавать в одно и то же время. Теоретически, каждый советник работает самостоятельно.

Но это не так... Похоже, что если сначала идет продажа, то советник на покупку не работает, и наоборот.

Может ли кто-нибудь перекодировать мой советник, управляющий MagicNumber? Что-то не так?

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

Похоже, что вы правильно указали магическое число. Единственная проблема в том, что вы не проверяете, существует ли ордер с таким же магическим номером в текущем торговом пуле. Вы должны пройтись по всем открытым ордерам и проверить, если OrderMagicNumber() == Ваш магический номер перед вводом новой сделки.

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