코딩하는 방법? - 페이지 299

 

MQL4에서 사용자 지정 시간 입력

사용자가 정의한 막대에서 시작하여 차트 끝까지 수평선 을 그릴 수 있는 코드를 MQL4로 작성할 수 있습니까?

다음은 Metastock과 동일한 코드입니다.

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

그리고 여기 결과가 있습니다

MQL4로 같은 일을 하기를 바랍니다.

 

다음과 같이 시도하십시오.

#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}

일부 지표(이미 작동하는 지표)에 복사하여 붙여넣고 차트에 첨부하기만 하면 됩니다.

kappari:
사용자가 정의한 막대에서 시작하여 차트 끝까지 수평선을 그릴 수 있는 코드를 MQL4로 작성할 수 있습니까?

다음은 Metastock과 동일한 코드입니다.

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

그리고 여기 결과가 있습니다

MQL4로 같은 일을 하기를 바랍니다.
 
mladen:
다음과 같이 시도하십시오.
#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}
일부 지표(이미 작동하는 지표)에 복사하여 붙여넣고 차트에 첨부하기만 하면 됩니다.

당신은 최고 감사합니다 mladen

 

안녕 믈라덴

여기에서 기능 의 근거에 대해 더 자세히 말씀해 주시겠습니까? 아직 잘 이해가 되지 않습니다. 감사해요

테런스

mladen:
이 기능을 사용해 보세요.
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
다음을 확인할 수 있습니다.
openBuys==0인 경우 공개 매수

openSells==0인 경우 공개 판매

 

tkuan77

한 번에 1개의 매수와 1개의 매도 주문을 제한하고 싶었습니다.

따라서 포지션을 개설하기 전에 개설된 주문 카운터에 전화를 걸면 얼마나 많은 개설된 매수 또는 매도를 보유하고 있는지 제어 할 수 있습니다.

예:

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order

openBuys uis가 0이 아닌 경우 새 구매 주문을 열지 않습니다. 판매에도 동일한 논리가 적용됩니다(해당 게시물의 두 번째 예).

tkuan77:
안녕 믈라덴

여기에서 기능의 근거에 대해 더 자세히 말씀해 주시겠습니까? 아직 잘 이해가 되지 않습니다. 감사해요

테런스
 

안녕 믈라덴

어쩌면 내가 나를 잘못 표현했을 수도 있습니다. 내가 달성하려는 것은 내 구매 기준이 충족되면 구매를 트리거하고 다른 구매 기준이 다시 충족되면 판매 기준이 충족되면 다른 구매 또는 판매를 트리거하는 것입니다. 그러나 어느 시점에서든 내가 가질 수 있는 최대 거래는 2입니다.

이전에 귀하의 방법을 시도했지만 여전히 동시에 2개의 거래를 여는 시스템이 발생하므로 EA가 동시에 2개의 거래를 여는 것과 동일한 문제로 Bars 기능 으로 제한하려고 했습니다.

여기에 가능한 원인은 무엇입니까? 내 논리와 관련이 있습니까?

문안 인사

테런스

mladen:
tkuan77

한 번에 1개의 매수와 1개의 매도 주문을 제한하고 싶었습니다.

따라서 포지션을 개설하기 전에 개설된 주문 카운터에 전화를 걸면 얼마나 많은 개설된 매수 또는 매도를 보유하고 있는지 제어할 수 있습니다.

예:

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order
openBuys uis가 0이 아닌 경우 새 구매 주문을 열지 않습니다. 판매에도 동일한 논리가 적용됩니다(해당 게시물의 두 번째 예).
 

어떤 유형의 주문이 현재 바에서 이미 열렸는지 확인하는 기능을 추가할 수 있으며 그렇게 하면 다음 틱에서 새 주문을 열지 못하게 됩니다. 예(현재 막대에서 열린 주문이 있음)인 경우 새 주문을 열지 않습니다. 그렇지 않은 경우 새 주문을 열 수 있습니다. 현재 바에서 열린 리와이어드 유형의 주문을 계산할 수 있는 기능 입니다.

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

tkuan77:
안녕 믈라덴

어쩌면 내가 나를 잘못 표현했을 수도 있습니다. 내가 달성하려는 것은 내 구매 기준이 충족되면 구매를 트리거하고 다른 구매 기준이 다시 충족되면 판매 기준이 충족되면 다른 구매 또는 판매를 트리거하는 것입니다. 그러나 어느 시점에서든 내가 가질 수 있는 최대 거래는 2입니다.

이전에 귀하의 방법을 시도했지만 여전히 동시에 2개의 거래를 여는 시스템이 발생하므로 EA가 동시에 2개의 거래를 여는 것과 동일한 문제로 Bars 기능으로 제한하려고 했습니다.

여기에 가능한 원인은 무엇입니까? 내 논리와 관련이 있습니까?

문안 인사

테런스
 
tkuan77:
안녕 믈라덴

어쩌면 내가 나를 잘못 표현했을 수도 있습니다. 내가 달성하려는 것은 내 구매 기준이 충족되면 구매를 트리거하고 다른 구매 기준이 다시 충족되면 판매 기준이 충족되면 다른 구매 또는 판매를 트리거하는 것입니다. 그러나 어느 시점에서든 내가 가질 수 있는 최대 거래는 2입니다.

이전에 귀하의 방법을 시도했지만 여전히 동시에 2개의 거래를 여는 시스템이 발생하므로 EA가 동시에 2개의 거래를 여는 것과 동일한 문제로 Bars 기능으로 제한하려고 했습니다.

여기에 가능한 원인은 무엇입니까? 내 논리와 관련이 있습니까?

문안 인사

테런스

두 번째 거래가 첫 번째 거래와 어떻게 다른지 지정하지 않았기 때문입니다. 미분은 x 번호의 형태일 수 있습니다. 막대 또는 가격이 FirstBuyPrice에서 멀어집니다.

 

Mladen에게 도움을 주셔서 감사합니다. 하지만 저는 당신에게 확인하고 싶습니다. 코드를 긴/짧은 함수 앞에 두겠습니까, 그 사이 또는 다른 곳에 넣어야 합니까? 계속 오류가 뜨는 것 같아서 출처를 못찾겠네요. 그리고 MagicNumber는 정수라고 가정합니까?

테런스

총계 = OrdersTotal();

if(총 < 2)

{

int countOpenedOnACurrentBar(int 유형)

{

int 열린AtBar = 0;

날짜/시간 startTime = 시간[0];

날짜/시간 endTime = 시간[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) 중단;

if(OrderMagicNumber() != MagicNumber) 계속;

if(OrderSymbol() != Symbol()) 계속;

if(OrderType() != 유형) 계속;

if(OrderOpenTime()=endTime) 계속;

열린AtBar++;

부서지다;

}

반환(openedAtBar);

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"내 EA",12345,0,녹색);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print("구매 주문이 열렸습니다 : ",OrderOpenPrice());

}

else Print("구매 주문 열기 오류: ",GetLastError());

리턴(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"내 EA",12345,0,레드);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print(" SELL 주문 이 열렸습니다 : ",OrderOpenPrice());

}

else Print("판매 주문 열기 오류: ",GetLastError());

반환(0);

}

반환(0);

}

mladen:
어떤 유형의 주문이 현재 바에서 이미 열렸는지 확인하는 기능을 추가할 수 있으며 그렇게 하면 다음 틱에서 새 주문을 열지 못하게 됩니다. 예(현재 막대에서 열린 주문이 있음)인 경우 새 주문을 열지 않습니다. 그렇지 않은 경우 새 주문을 열 수 있습니다. 현재 바에서 열린 리와이어드 유형의 주문을 계산할 수 있는 기능입니다.
int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

 

...

테런스

그것 은 기능 입니다 . EA 끝에 게시하고 현재 바에서 주문이 이미 열려 있는지 확인하는 것이 적절하다고 생각되는 곳에 전화를 겁니다.

tkuan77:
Mladen에게 도움을 주셔서 감사합니다. 하지만 저는 당신에게 확인하고 싶습니다. 코드를 긴/짧은 함수 앞에 두겠습니까, 그 사이 또는 다른 곳에 넣어야 합니까? 계속 오류가 뜨는 것 같아서 출처를 못찾겠네요. 그리고 MagicNumber는 정수라고 가정합니까?

테런스

총계 = OrdersTotal();

if(총 < 2)

{

int countOpenedOnACurrentBar(int 유형)

{

int 열린AtBar = 0;

날짜/시간 startTime = 시간[0];

날짜/시간 endTime = 시간[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) 중단;

if(OrderMagicNumber() != MagicNumber) 계속;

if(OrderSymbol() != Symbol()) 계속;

if(OrderType() != 유형) 계속;

if(OrderOpenTime()=endTime) 계속;

열린AtBar++;

부서지다;

}

반환(openedAtBar);

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"내 EA",12345,0,녹색);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print("구매 주문이 열렸습니다 : ",OrderOpenPrice());

}

else Print("구매 주문 열기 오류: ",GetLastError());

리턴(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"내 EA",12345,0,레드);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print("판매 주문이 열렸습니다 : ",OrderOpenPrice());

}

else Print("판매 주문 열기 오류: ",GetLastError());

반환(0);

}

반환(0);

}