프로그래머가 C를 배우기 전에 기계 명령어, 어셈블러, Fortran, PL/1, Pascal 등을 거쳐야 했던 시대는 지났습니다. 이 모든 것이 교과서도 없고 적절한 설명도 없이 Volchansky가 위에서 말했듯이 구부러진 글자로 인쇄되어 있습니다. 선적 서류 비치.
지금은 응용 프로그래밍 언어가 내장되어 있는 복잡한 다기능 응용 시스템의 시대이며 이 언어의 임무는 프로그래밍의 정글에 깊이 파고들지 않고도 응용 프로그램 사용자가 응용 프로그램 터미널에 액세스할 수 있도록 하는 것입니다. 짧은 시간에 마스터하고 이 터미널 언어를 사용합니다.
여기 내 아날로그 기능이 있습니다(CTSTime은 시간의 클래스-시계열입니다). 주석이 있어도 초보자에게는 약간 복잡하다고 생각합니다. 따라서 SB에는 실제로 누락되어 있습니다.
// Функция ищет бар, внутри которого находится указанный момент.
// Если такой бар найден - возвращается true и ссылка rIdx устанавливает нужное значение
// Если такой бар не найден - возвращается false и ссылка rIdx устанавливает значение на ближайший индекс,
// время которого меньше, требуемого.
// При недостаточности буффера функция возвращает false, ссылка устанавливается на отрицательное значение.
// NOTE !!! ненаступивший момент может лежать внутри нулевого бара, в этом случае вернется true,
// даже если фактически данный момент еще не наступил. false вернется только если данный момент лежит позже
// нулевого бара.
// Если искомый момент находится раньше самого раннего бара, возвращается false и rIdx = INT_MAX
bool CTSTime::FindIdxOf( datetime dtMomentToFind, int & rIdx)
{
ASSERT(dtMomentToFind > MIN_DATETIME && dtMomentToFind < NEVER_EXPIRES);
// Пока найденный индекс - невалиден.
rIdx = WRONG_VALUE ;
// Если данных нет - возвращаем отрицательный результат поиска.if (GetTSSize() == 0 )
return ( false );
// Найдем продолжительность текущего бараint iSecondsInBar = PeriodSeconds (m_etTimeframe);
ASSERT(iSecondsInBar >= SECS_IN_MINUTE);
datetime dtMomentOfZeroBar = GetTime( 0 );
datetime dtMomentOfLastBar = GetTime(GetTSSize()- 1 );
// Искомый момент лежит внутри или позже, чем нулевой бар ? if (dtMomentToFind >= dtMomentOfZeroBar)
{
rIdx = 0 ;
// Искомый момент лежит на открытии минус первого бара или позже ? if (dtMomentToFind >= dtMomentOfZeroBar + iSecondsInBar)
return ( false ); // Искомый момент лежит после нулевого бара. // Искомый момент лежит внутри нулевого бара.return ( true );
};
// Здесь ясно, что искомый момент был ранее нулевого бара. // Проверим, может быть искомый момент лежит раньше последнего бара ? if (dtMomentToFind < dtMomentOfLastBar)
{
// Увы, такого раннего момента в таймсерии нет. // Возвращаем самый большой индекс бара, какой можем возвратить// (Потому, что бара со временем меньше требуемого - в таймсерии нет).
rIdx = INT_MAX ;
return ( false );
};
// Здесь ясно, что искомый момент был позже начала самого раннего бара, но раньше начала самого нового бара.
ASSERT(GetTSSize() > 1 ); // Проверим, размер буффера должен быть минимум два бара. (Иначе условие не выполняется, что искомый момент был позже начала самого раннего бара, но раньше начала самого нового бара, не выполняется)// Ищем примерно, где был данный момент.
ASSERT(dtMomentOfZeroBar > dtMomentToFind);
ASSERT(dtMomentOfZeroBar > dtMomentOfLastBar);
ulong ulSecFromSearchToLatest = dtMomentOfZeroBar - dtMomentToFind;
ulong ulSecFromEarlestToLatest = dtMomentOfZeroBar - dtMomentOfLastBar;
ASSERT(ulSecFromEarlestToLatest > ulSecFromSearchToLatest);
double dResIdx = ( double )ulSecFromSearchToLatest*( double )(GetTSSize()- 1 )/( double )ulSecFromEarlestToLatest;
ASSERT(dResIdx < INT_MAX && dResIdx >= 0 );
int iResIdx = ( int ) MathRound (dResIdx);
ASSERT(iResIdx >= 0 && iResIdx<( int )GetTSSize()); // По идее, мы должны уложиться в этот диапазон.// Поскольку мы исследуем минимум два бара (текущий и следующий),// Текущий бар не должен быть нулевым.// Поскольку случай с буффером в один бар у нас был отсеян раньше, мы не должны получить ошибку.if (iResIdx == 0 )
iResIdx = 1 ;
// Получен приблизительный индекс (uiResIdx).// Уточняем. Берем два бара, текущий и следующий.datetime dtResMoment;
datetime dtNextMoment;
dtResMoment = GetTime(iResIdx);
dtNextMoment = GetTime(iResIdx- 1 );
int iShift = 0 ;
bool bUp = false ;
bool bDown = false ;
do
{
if (dtResMoment > dtMomentToFind) // Если искомый момент раньше начала первого бара
{
iShift = 1 ; // Возьмем на один бар раньше.
bUp = true ; // Запомним направление
}
else// Иначе - Искомый момент равен или позже начала первого бара.
{
if (dtNextMoment <= dtMomentToFind) // Если искомый момент больше или равен началу второго бара
{
iShift = - 1 ; // Возьмем на один бар позже
bDown = true ; // Запомним направление
}
else// Иначе - искомый момент равен или позже начала перого бара и раньше начала второго бара
{
iShift = 0 ; // То есть, можно выходить из цикла коррекции.
}
}
iResIdx += iShift; // Смещаемсяif (iResIdx > ( int )GetTSSize() || iResIdx <= 0 ) // Проверим на допустимый диапазон
{
ASSERT( false ); // В серии недостаточно данных (мал буффер)
rIdx = INT_MAX ;
return ( false );
};
dtResMoment = GetTime(iResIdx); // Запрашиваем новые данные
dtNextMoment = GetTime(iResIdx- 1 );
if (bUp == true && bDown == true ) // Контроль направления коррекции
{
ASSERT( false ); // Сменилось направление коррекции !!!
iShift = 0 ;
}
}
while (iShift != 0 );
// В этой точке искомый момент равен или позже начала перого бара и раньше начала второго бара.// Проверим, может быть, искомый момент позже конца первого бара, но раньше начала второго бара // (между барами разрыв, и искомый момент находится именно там)// Ясно, что ссылка должна показывать на первый бар в любом случае
rIdx = iResIdx;
if (dtMomentToFind >= dtResMoment+iSecondsInBar)
// Действительно, искомый момент - внутри разрыва между барами.return ( false );
return ( true );
};
프로그래머가 C를 배우기 전에 기계 명령어, 어셈블러, Fortran, PL/1, Pascal 등을 거쳐야 했던 시대는 지났습니다. 이 모든 것이 교과서도 없고 적절한 설명도 없이 Volchansky가 위에서 말했듯이 구부러진 글자로 인쇄되어 있습니다. 선적 서류 비치.
지금은 응용 프로그래밍 언어가 내장되어 있는 복잡한 다기능 응용 시스템의 시대이며 이 언어의 임무는 프로그래밍의 정글에 깊이 파고들지 않고도 응용 프로그램 사용자가 응용 프로그램 터미널에 액세스할 수 있도록 하는 것입니다. 짧은 시간에 마스터하고 이 터미널 언어를 사용합니다.
동의한다! 올바른 표현. 무역 터미널 은 무역을 촉진해야 합니다.
이것은 당신이 판단하는 사람입니다. 회사의 얼굴로서 당신이 트롤링에 빠져드는 것은 좋지 않습니다. MT4를 경험한 사람도 어려움을 겪는다는 말을 이미 들었습니다. 그리고 그들은 레고가 필요하지 않습니다.
트롤링 본 적 있어?
나는 당신의 전략에 대한 테스트 어드바이저를 간단하고 쉽게 작성할 수 있는 기회가 많다는 것을 이미 여러 번 썼습니다.
그리고 도움이 되는 링크도 주셨습니다. 이제 여기에서 이 인증서에 대해 질문하기 시작하면 최소한 그러한 지식에 대한 관심이 보일 것입니다. 그러나 그것은 모든 것이 얼마나 나빴는지에 대해 계속되었습니다.
그래서 제가 말하는 이유는 - 아마도 지금 우리 세대는 - 18세, 가족들은 외바퀴 손수레를 사야 하는 의무가 있는 21세입니다. 오두막을 구합시다. 그리고 공부하기 위해 - 아니, 왜?
어셈블러는 얼마나 복잡합니까? 나는 그것의 기능이 필요하다
불과 10년 전 포럼에서 신규 이민자들이 이런 질문을 던졌기 때문입니다. 훨씬 더 어렵고 흥미로운 질문입니다.
그건 그렇고, MQL4에 대한 현재 질문은 MQL5에 대한 질문보다 훨씬 더 의미가 있습니다. 그 이유는 명백하며 MQL 버전의 시대가 아닙니다.
아니, 난 몰라. 무슨 얘기를 하는 건가요?
그러나 Alexey는 이제 예를 들어 설명하지 않겠습니다. 그러나 당신은 실험하기를 좋아합니다. 운전하고 다른 입력 데이터로 무엇을 반환하는지 확인하십시오.
지금은 기억하고 검색하기가 어렵습니다.
글쎄, fxsaber는 예제를 제공했습니다 (직접 수정했습니다). 코드로 비교하십시오.
여기에서 Bar()가 나쁜 결과를 반환하는 조건을 확인할 수 있습니다.
초보자가 가장 먼저 작성하는 것은 거래 스크립트입니다. 두 번째는 가장 간단한 지표입니다. 세 번째는 단순한 조언자입니다.
MQL4의 첫 번째 단계조차도 MQL5보다 훨씬 빠르게 초보자가 극복합니다.
거래 스크립트??? 왜 전문가가 아니거나 표준 라이브러리 를 대체하지 않습니까?
제 생각에 거래 스크립트를 작성하는 것은 명백한 중급 작업이며 초보자에게는 적합하지 않습니다.
초보자는 먼저 가장 단순한 문자열 출력으로 자신을 제한해야 합니다. 그런 다음 - 가장 간단한 지표. 그런 다음에만 지표 및 거래 기능 요청을 진행하십시오.
어셈블러는 얼마나 복잡합니까? 나는 그것의 기능이 필요하다
정확히 무엇?
어셈블러는 이렇게 직접적으로 "기능이 필요했습니다"라고 말하기에는 너무 구체적입니다.
안전보장이사회가 포럼에 새로 온 사람들에게 판매하는 주제에 대한 새로운 예와 게으른 사람들과도 거리가 먼 사람들에게도 왜 그것이 정말 어려운지에 대한 새로운 예입니다. 오늘은 징징거리는 기색 없이 매우 건설적인 MQL5 질문을 받았습니다.
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
오류, 버그, 질문
다미르카 , 2018.01.09 12:14
안녕하세요! https://www.mql5.com/ru/articles/100 에서 MQL5를 배우기 시작했습니다. 코드를 실행했는데 오류 4756이 발생했고 설명서를 살펴보았지만 더 쉬워지지 않았습니다. 좋아요, 간단한 것(경고/인쇄...)부터 시작하겠습니다. 가장 중요한 기능 중 하나는 OrderSend입니다. OrderSend를 사용하는 방법에 대한 forum\documentation 검색을 시작했습니다. 이 기사 https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions 에서 구매 위치를 여는 코드를 보았습니다. 오류 4756 및 retcode 10030을 받았습니다. 10030 - 이것이 OrderSend 속성이라는 것을 깨달았지만 이 속성을 사용하는 방법(다른 사람의 코드를 보았음)과 가장 중요한 것은 무엇을 위한 것인지 이해하지 못했습니다. 그런 다음 https://www.mql5.com/ru/docs/trading/ordersend 를 열고 코드를 복사하고 실행했습니다. 모든 것이 정상이었고 작동했습니다.
그러나 나는 여전히 오류 4756이 나타나는 이유와 10030뿐만 아니라 그것을 제거하는 방법을 이해하지 못합니다.
사이의 코드를 살펴보니
이
제 생각에는 거의 동일하며 이러한 오류가 나타나는 위치(4756 및 10030)를 보지 못합니다. 손가락으로 가리키며 설명해주세요
중재자 응답
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
오류, 버그, 질문
블라디미르 카르푸토프 , 2018.01.09 12:20
CTrade 거래 클래스를 사용하십시오 - 이 방법을 사용하면 실수를 최소화할 수 있습니다.
매수를 열기 위해 거래 요청을 보내는 예:
아마 내가 그것을 알아내는 데 도움이되었을 것입니다. 그러나 사실 초심자의 문제는 아주 초심자의 문제가 아니다.
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
오류, 버그, 질문
fxsaber , 2018.01.09 13:22
https://www.mql5.com/en/search#!keyword=지원되지 않음%20filling%20mode
저것들. 당신은 가서 지정된 주제에 대한 링크를 읽어야합니다. 안전보장이사회에서는 멋진 곳을 통해 이 문제를 해결합니다. 저것들. 가장 간단한 거래 스크립트(초보자의 첫 번째 프로그램)를 작성할 때 거의 간단합니다.
거래 스크립트??? 왜 전문가가 아니거나 표준 라이브러리 를 대체하지 않습니까?
제 생각에 거래 스크립트를 작성하는 것은 명백한 중급 작업이며 초보자에게는 적합하지 않습니다.
초보자는 먼저 가장 단순한 문자열 출력으로 자신을 제한해야 합니다. 그런 다음 - 가장 간단한 지표. 그런 다음에만 지표 및 거래 기능 요청을 진행하십시오.
저는 즉시 다중 통화 MTF 전문가 고문으로 시작했습니다. 그리고 초보자를 위한 도움말 브랜치에서 꽤 기분이 좋았습니다. 예, 그리고 나는 많은 질문을하지 않았습니다. 도움이 있고 두뇌가 어딘가에 있습니다 ...
아, 그건 그렇고, iBarsShift 에 대해 .
여기 내 아날로그 기능이 있습니다(CTSTime은 시간의 클래스-시계열입니다). 주석이 있어도 초보자에게는 약간 복잡하다고 생각합니다. 따라서 SB에는 실제로 누락되어 있습니다.