친애하는 프로그래머 여러분, 동시에 두 개 이상의 거래 시리즈를 여는 것을 금지하는 데 도움을 주십시오(시리즈는 주문이 손실 또는 0으로 마감된 다음 동일한 상품에 대해 다음 거래가 열리는 경우이지만 즉, 한 시리즈의 거래가 두 번째로 열리고 후속 거래가 다른 도구에 대해 금지되는 경우(봇이 동시에 다른 도구에서 작동함). 이건 터미널의 전역 변수를 통해서 해야 한다고 생각하는데, 지식과 경험이 부족해서 최근에 MQL 을 배우기 시작했습니다. 이것은 바이너리 옵션 조언자입니다. 다음은 코드입니다.
프로그래밍할 때 질문이 있었습니다. 어떻게든 Expert Advisor 에서 밀리초의 정확도로서버 시간 을 얻을 수 있습니까? 예를 들어, 우리는 09/23/2016 14h를 얻습니다. : 53분 : 54000밀리초? 정확히 54초, 000m/sec입니다.
관심 문의. 서버의 마지막 알려진 시간, 마지막 견적 TimeCurrent()의 도착 시간 또는 서버의 현재 시간을 지정한다는 것은 무엇을 의미합니까?
TimeCurrent()인 경우, 새로운 인용이 있는 패킷이 인터넷을 통해 10-500ms 내에 서버에서 터미널로 이동하고 이 시간이 패킷마다 다르다는 점을 감안할 때 이것의 용도는 무엇입니까? 또한 마지막 견적의 도착이 무엇인지 확실하지 않습니다. 여러 출처, 유동성 공급자에서 서버로 이동한 후 처리된 후 서버는 새 틱을 보냅니다. 또한 서버의 시스템 타이머가 천문 시간과 동기화되는 방식도 알려져 있지 않습니다. 2014/09/01 04:15 ~ 06:15 모스크바 시간(목요일, 거래일) 천문학적 편차가 아닌 31개 기업 평균 편차로 파악했습니다. 25개 시점에 대한 그림은 다음과 같은 편차를 보여줍니다(ms 단위가 아닌 초 단위).
그리고 서버의 데이터에 따라 밀리초 만에 무언가를 찾는 요점이 무엇입니까?
두 번째 옵션은 더 명확합니다. 컴퓨터에서 천문 시간과의 동기화가 사용자에게 알려진 오류로 수행되는 경우 천문 시간은 서버가 작동하는 지역에서 동일한 오류(영역의 차이 고려)로 알려져 있습니다. 근데 왜 그럴까...
친애하는 프로그래머 여러분, 동시에 두 개 이상의 거래 시리즈를 여는 것을 금지하는 데 도움을 주십시오(시리즈는 주문이 손실 또는 0으로 마감된 다음 동일한 상품에 대해 다음 거래가 열리는 경우이지만 즉, 한 시리즈의 거래가 두 번째로 열리고 후속 거래가 다른 도구에 대해 금지되는 경우(봇이 동시에 다른 도구에서 작동함). 이건 터미널의 전역 변수를 통해서 해야 한다고 생각하는데, 지식과 경험이 부족해서 최근에 MQL 을 배우기 시작했습니다. 이것은 바이너리 옵션 조언자입니다. 다음은 코드입니다.
extern 이중 로트 = 1; // 많은
외부 intExp = 1; // 만료
extern int 대기 = 1; // 한 방향의 촛불 개수
extern int 시간 초과 = 1; // 시간 간격
extern 이중 승수 = 3; // 승수
extern int 미끄러짐 = 5; // 미끄러짐
외부 정수 매직 = 2090; // 마법
int 티켓, 유형;
두 배 가격, 많은;
//+----------------------------------------------- --------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- --------------------+
int OnInit()
{
반환(INIT_SUCCESSED);
}
//+----------------------------------------------- --------------------+
//| 전문적인 초기화 해제 기능 |
//+----------------------------------------------- --------------------+
무효 OnDeinit(const int 이유)
{
}
//+----------------------------------------------- --------------------+
//| 전문가 틱 기능 |
//+----------------------------------------------- --------------------+
무효 OnTick()
{
// --------------- 거래 시작 ---------------
if (OrdersTotal() == 0) // 주문 수는 0과 같아야 합니다.
{
if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
// 마지막 거래가 수익성이 없으면 같은 거래가 열리지만 로트가 증가합니다.
{
유형 = TypeLastHistOrder();
if (유형 == OP_BUY) 가격 = 묻기;
if (유형 == OP_SELL) 가격 = 입찰가;
로트 = NormalizeDouble(LotsLastHistOrder()*승수, 2);
티켓 = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// 마지막 거래의 이익이 0이면 동일하게 엽니다.
{
유형 = TypeLastHistOrder();
if (유형 == OP_BUY) 가격 = 묻기;
if (유형 == OP_SELL) 가격 = 입찰가;
많은 = NormalizeDouble(LotsLastHistOrder(), 2);
티켓 = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
|| CountHistTrades() == 0)// 마지막 거래가 수익성이 있으면 주문이 열립니다.
{
if (SignalBuy() && OrdersTotal() == 0)
{
티켓 = OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (SignalSell() && OrdersTotal() == 0)
{
티켓 = OrderSend(Symbol(), OP_SELL, 랏, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
댓글("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELL)=",
PriceCloseLastHistOrder(OP_SELL) );
}
}
}
}
//+----------------------------------------------- --------------------+
int CountTrades(int type = -1) // 거래 횟수 결정
{
정수 cnt = 0;
for (int i=OrdersTotal()-1; i>=0; i--) // 루프는 절대적으로 모든 미결 주문을 통과합니다. i -- 주문의 일련 번호
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // 함수는 시장에 서수 i의 주문이 있는지 확인합니다.
// 그렇다면 다음 조건을 확인합니다 ...
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // Symbol인 경우,
// 주문이 열리는 곳은 현재 기호와 동일하며 주문의 마법은 현재 고문의 설정에 있는 마법과 같습니다.
// 주문 유형은 값 유형과 같음(또는 유형 == -1(주문을 계산하는 데 필요한 유형이 중요하지 않은 경우))
cnt++; // cnt 변수에 1이 추가되고 주기가 끝나면 cnt는 이미 거래 수와 같게 됩니다.
// 특정 유형의 현재 통화 쌍에 대해 현재 고문이 열었습니다.
}
}
리턴(cnt); // 변수 cnt의 값을 반환
}
//+----------------------------------------------- --------------------+
int CountHistTrades(int 유형 = -1)
{
정수 cnt = 0;
(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))
cnt++;
}
}
리턴(cnt);
}
//+----------------------------------------------- --------------------+
bool SignalBuy()
{
for (int i=1; i<=대기; i++)
{
if (닫기[i] > 열기[i]) return(false);
}
if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= 대기 || (대기 == 0 && TimeCurrent() >= TimeLastHistOrder()+시간 초과))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
반환(거짓);
}
//+----------------------------------------------- --------------------+
bool SignalSell()
{
for (int i=1; i<=대기; i++)
{
if (닫기[i] < 열기[i]) return(false);
}
if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= 대기 || (대기 == 0 && TimeCurrent() >= TimeLastHistOrder()+시간 초과))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
반환(거짓);
}
//+----------------------------------------------- --------------------+
날짜/시간 TimeLastHistOrder(int 유형 = -1)
{
날짜 시간 마지막 시간 = 0;
날짜 시간 오픈 시간 = 0;
(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))
{
if (OrderCloseTime() > 마지막 시간)
{
마지막 시간 = OrderCloseTime();
오픈타임 = 주문오픈타임();
}
}
}
}
반환(오픈 시간);
}
//+----------------------------------------------- --------------------+
intTypeLastHistOrder()
{
날짜 시간 = 0;
정수 유형 = -1;
(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderCloseTime() > 시간)
{
시간 = OrderCloseTime();
유형 = 주문 유형();
}
}
}
}
반환(유형);
}
//+----------------------------------------------- --------------------+
이중 LotLastHistOrder(int 유형 = -1)
{
날짜 시간 = 0;
이중 로트 = 0;
(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))
{
if (OrderOpenTime() > 시간)
{
시간 = OrderOpenTime();
제비 = OrderLots();
}
}
}
}
반환(많은);
}
//+----------------------------------------------- --------------------+
두 배 PriceCloseLastHistOrder(int 유형 = -1)
{
날짜 시간 = 0;
이중 가격 = 0;
(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))
{
if (OrderCloseTime() > 시간)
{
시간 = OrderCloseTime();
가격 = OrderClosePrice();
}
}
}
}
반품(가격);
}
//+----------------------------------------------- --------------------+
두 배 PriceOpenLastHistOrder(int 유형 = -1)
{
날짜 시간 = 0;
이중 가격 = 0;
(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))
{
if (OrderCloseTime() > 시간)
{
시간 = OrderCloseTime();
가격 = OrderOpenPrice();
}
}
}
}
반품(가격);
}
//+----------------------------------------------- ------ --------------------+
프로그래밍할 때 질문이 있었습니다. 어떻게든 Expert Advisor 에서 밀리초의 정확도로 서버 시간 을 얻을 수 있습니까?
예를 들어, 다음을 얻습니다. 09/23/2016 14h. : 53분 : 54000밀리초? 정확히 54초, 000m/sec입니다.
안녕 동료들!
프로그래밍할 때 질문이 있었습니다. 어떻게든 Expert Advisor 에서 밀리초의 정확도로 서버 시간 을 얻을 수 있습니까?
예를 들어, 우리는 09/23/2016 14h를 얻습니다. : 53분 : 54000밀리초? 정확히 54초, 000m/sec입니다.
관심 문의. 서버의 마지막 알려진 시간, 마지막 견적 TimeCurrent()의 도착 시간 또는 서버의 현재 시간을 지정한다는 것은 무엇을 의미합니까?
TimeCurrent()인 경우, 새로운 인용이 있는 패킷이 인터넷을 통해 10-500ms 내에 서버에서 터미널로 이동하고 이 시간이 패킷마다 다르다는 점을 감안할 때 이것의 용도는 무엇입니까? 또한 마지막 견적의 도착이 무엇인지 확실하지 않습니다. 여러 출처, 유동성 공급자에서 서버로 이동한 후 처리된 후 서버는 새 틱을 보냅니다. 또한 서버의 시스템 타이머가 천문 시간과 동기화되는 방식도 알려져 있지 않습니다. 2014/09/01 04:15 ~ 06:15 모스크바 시간(목요일, 거래일) 천문학적 편차가 아닌 31개 기업 평균 편차로 파악했습니다. 25개 시점에 대한 그림은 다음과 같은 편차를 보여줍니다(ms 단위가 아닌 초 단위).
그리고 서버의 데이터에 따라 밀리초 만에 무언가를 찾는 요점이 무엇입니까?
두 번째 옵션은 더 명확합니다. 컴퓨터에서 천문 시간과의 동기화가 사용자에게 알려진 오류로 수행되는 경우 천문 시간은 서버가 작동하는 지역에서 동일한 오류(영역의 차이 고려)로 알려져 있습니다. 근데 왜 그럴까...
전략 테스터 의 어딘가에서 최적화가 사라졌습니다. 갈까마귀는 내가 이해할 수 없는 아무 가치도 없다. MT4 빌드 1010. Windows 8.1.
최적화를 활성화하는 방법을 알려주세요.
스크린샷을 첨부합니다. 최적화 버튼이 없습니다.
}
나는 유능한 프로그래머에게 내 실수가 무엇인지 설명하도록 요청합니다 ?? 왜 순서가 수정되지 않았습니까!!! 컴파일러는 동시에 오류를 제공하지 않습니다
교과서를 공부했다.. 읽고.. 구체적으로 오류를 지적해 주실 수 있어요.. 컴파일러가 오류를 주지 않고 테스터에 오류가 없기 때문입니다. 그러나 순서는 수정되지 않습니다. 마치 수정 순서가 있는 것처럼 프로그램에서 전혀 보이지 않습니다
OrderSend() 가 반환하는 내용을 주의 깊게 읽으십시오.
그리고 예, 나는 이것을 할 것입니다:
OrderSend()가 반환하는 내용을 주의 깊게 읽으십시오.
그리고 예, 나는 이것을 할 것입니다: