dongke 2007-11-17 16:03
请教动态计算浮赢浮亏问题
最近研究程序。对价格变动每次调用,和只调用一次 有些迷糊。问题如下,谢谢解答者!
int start()
void OpenOrders()
void CloseOrders()
每次价格变动的时候程序就会读一次。 那么我的问题是,读程序的顺序 ,是怎样的。先读int start() 的内容吗,还是从上到下读。
我看到有些把int start() 都写到了程序行的最后。
另外,对于比如iMA这种计算结果的式子,需要放到什么地方才是每次都调用。 我放到void OpenOrders()里边 的话, void CloseOrders()就不能用, 放在外边。程序又老提示出错说 不应该放这里,编译不过。
望哪位帮忙解答一下。
很是感谢!
[[i] 本帖最后由 dongke 于 2007-11-17 23:13 编辑 [/i]]
xfxyldj 2007-11-17 20:10
1、[color=Red]你需要了解子程序的定义和用法。仔细研究下吧。[/color]:yct38
2、int start()类似于C语言中的main()程序。和他所在的位置没有关系。
3、子程序在调用的时候才会被执行,如果不调用就不会被执行。子程序的调用必须在int start()中(或者镶嵌调用)
4、对于iMA()函数相当于一个变量来使用。因此不论在子程序还是在主程序中,它不是一个函数。因此不能写在程序外面。你可以定义一个全局变量。把iMA()的值在int start()赋予这个变量。在子程序中调用这个全局变量就可以了。
5、每次价格变动的时候只有int start()被执行了一次,如果在int start()中没有达到调用子程序的条件,子程序是不会被执行的。
6、写了这么多突然发现,问题出在你对子程序的理解上。:yct47
[[i] 本帖最后由 xfxyldj 于 2007-11-17 20:45 编辑 [/i]]
dongke 2007-11-17 23:12
欧。 版主写得相当详细。。
我完全清楚这个逻辑了。
以前学的是basic 对c 基础性的东西不够了解。谢谢热心版主
dongke 2007-11-17 23:20
我觉得我提出的问题或许以后有人碰到会翻翻帖子。也不用老开贴问了。 哈哈。
问题如下:
1、如果现在我用
ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lots,orderprice,2,0,0,"limitbuy",uniqueGridMagic,0,Green);
ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lots,orderprice,2,0,0,"limitsell",uniqueGridMagic,0,Red); 两个命令下了2个挂单。
如果过了一阵挂上了一个。 另外一个还没挂上。
OrdersTotal() 返回的值 是1 还是2 呢?
那我现在要计算第一个成交的单的浮赢应该用OrderTakeProfit()命令
怎么指定是哪个单的profit呢。 是这样写吗OrderTakeProfit(ticket) ??
请教,help里边解释用了一个print 并没说怎么选择指定的订单 的赢利问题。 我就是不知道如何对号入座 :yct40
:yct42 谢谢!
dongke 2007-11-17 23:50
for ( int m=1;m<=ticket;m++)
{
if(OrderSelect(m,SELECT_BY_POS)==true)
{
currentprofit+=OrderTakeProfit();
}
}
不知道是不是这样。 这样对吗?? 感谢!
xfxyldj 2007-11-18 00:11
回复 4楼 的帖子
1、OrdersTotal() 返回的是2
2、OrderTakeProfit()函数必须在OrderSelect()函数之后。并且没有形参。返回OrderSelect()函数选中的那个订单的盈利。
3、对于订单的选择,你可以研究下“编程讲解里面那个MACD例子程序”。
4、你那个循环看上去有些问题。OrderSelect()可以选中成交的和未成交的订单(挂单)。
dongke 2007-11-18 09:02
解释得太清楚了。 完全明白了。
dongke 2007-11-18 09:14
版主,我最后写成了这样加了判断。不过还是功能没出来。代码如下。请看哪里有错。
for ( int m=1;m<=totalorders;m++)
{
if(OrderSelect(m,SELECT_BY_POS)==true && (OrderType() == OP_BUY || OrderType() == OP_SELL))
{
OrderSelect(m,SELECT_BY_POS);
currentprofit+=OrderTakeProfit();
}
}
Comment("Current profit is",currentprofit);
dongke 2007-11-18 10:03
是不是orderselect 命令没弄对。
请教版主关于这几个命令的区别。
OrderSelect(m,SELECT_BY_TICKET);
OrderSelect(m,SELECT_BY_POS);
OrderSelect(m,SELECT_BY_POS,MODE_TRADES);
啥区别呢。
dongke 2007-11-18 11:03
区别我现在能搞清楚了。SELECT_BY_POS 是根据单顺序来选择,而ticket是根据订单号码来选择。我把程序改了一下。不过好像还是没反映。 我没招了。请教
for ( int m=1;m<=totalorders;m++)
{
if(OrderSelect(m,SELECT_BY_POS,MODE_TRADES)==true && (OrderType() == OP_BUY || OrderType() == OP_SELL))
{
currentprofit=OrderTakeProfit()+currentprofit;
}
}
Comment("Current profit is"," ",currentprofit);
currentprofit老不计算,要不就是comment的问题。
xfxyldj 2007-11-18 12:43
对于订单的选定问题很多。
对于你的问题我不准备完全解答。我贴两个子程序,你研究下其中的代码。有问题再说。
[color=Red]还有昨晚不小心把你的关仓问题的帖子分割合并搞错了都删掉了,对不起。发信息今天起来一看发给自己了。:yct38 [/color][code]//+------------------------------------------------------------------+
//| SearchOrder 订单查询 函数 |
//+------------------------------------------------------------------+
int SearchOrder (int MAGIC,int K)
{
//----
int i=0;
for ( int z = OrdersTotal() - 1; z >= 0; z -- )
{
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
Print("OrderSelect(", z, ",SELECT_BY_POS) - Error #",GetLastError() );
continue;
}
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber() != MAGIC )continue;
if ( OrderType()==K ) i=OrderTicket();
}
//----
return(i);
}[/code]这个搜索程序搜索以MAGIC标记的类型为K的订单。[code]//+------------------------------------------------------------------+
//| CloseOrderBuy function |
//+------------------------------------------------------------------+
int CloseOrderBuy(int MAGIC)//CloseOrderBuy(Magic)
{
//----
for ( int z = OrdersTotal() - 1; z >= 0; z -- )
{
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
Print("OrderSelect(", z, ",SELECT_BY_POS) - Error #",GetLastError() );
continue;
}
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber() != MAGIC )continue;
if (OrderType()==OP_BUY)
{
if (!OrderClose(OrderTicket(), OrderLots(), Bid, 3))
Print("OrderClose(",OrderTicket(), ",Buy) - Error #",GetLastError() );
}
}
//----
return(0);
}[/code]这是一个买单关仓函数,关闭以MAGIC标记的成交买单。
dongke 2007-11-18 13:42
谢谢版主的回答。
上边的程序我仔细读了下。 我已经知道OrderSelect的选择pos和SELECT_BY_TICKET 的区别,pos 是按照下单的顺序选, ticket是按照订单号码选。
我郁闷就在这里呢。
你看我的代码。
for ( int m=1;m<=totalorders;m++)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
OrderSelect(m,SELECT_BY_POS,MODE_TRADES);
currentprofit=OrderTakeProfit()+currentprofit;
}
}
Comment("Current profit is"," ",currentprofit);
xfxyldj 2007-11-18 13:47
回复 12楼 的帖子
1、去读上面的代码吧,你没读懂。for不对。m从0开始。
2、OrderType() 是针对OrderSelect()选中的订单有效。因此次序错了。
dongke 2007-11-18 14:08
版主 谢谢了。。问题我找到了。是OrderProfit() 不是OrderTakeProfit()
我命令用错了。感谢! :yct47
xfxyldj 2007-11-18 14:49
回复 14楼 的帖子
问题很严重。
OrderType() 是针对OrderSelect()选中的订单有效。因此次序错了。
dongke 2007-11-19 18:53
弄明白了。 搞定了。。谢谢版主。
页:
[1]